Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
PYaVU_s.doc
Скачиваний:
44
Добавлен:
24.02.2016
Размер:
665.09 Кб
Скачать
    1. Вызовы функций

Вызов функции - это выражение, которое передает управление и фактические аргументы (если они есть) функции. Вызов функции имеет следующее синтаксическое представление:

<expression> ([<expression-list>])

Выражение <expression> вычисляется как адрес функции. Список выражение <expression-list>, в котором выражения следуют через запятую, представляет список фактических аргументов, посылаемых функции. Список выражений может быть пустым.

При выполнении вызова функции происходит замена формальных аргументов на фактические. Перед заменой каждый из фактических аргументов вычисляется. Первый фактический аргумент соответствует первому формальному аргументу, второй - второму и т.д.

Вызванная функция работает с копией действительных аргументов, поэтому любое изменение, сделанное функцией с аргументами, не отразится на оригинальных величинах, с которых была сделана копия.

Передача управления осуществляется на первый оператор функции. Выполнение оператора return в теле функции возвращает управление и, возможно, значение возврата в вызывающую функцию. Если оператор return не выполнен, то управление возвращается после выполнения последнего оператора тела функции. При этом величина возврата не определена.

Важно: Выражения в списке аргументов вызова функции могут выполняться в любом порядке, так что выражения с побочными эффектами могут дать непредсказуемые результаты. Компилятор только гарантирует, что все побочные эффекты будут вычислены перед передачей управления в вызываемую функцию.

Выражение перед скобками должно быть преобразовано к адресу функции. Это означает, что функция может быть вызвана через любое выражение типа указателя на функцию. Это позволяет вызывать функцию в той же самой манере, что и объявлять. Это необходимо при вызове функции через указатель. Например, предположим, что указатель на функцию объявлен как следующий:

int (* fpointer)(int,int);

Идентификатор fpointer указывает на функцию с двумя аргументами типа int и возвращающую значение типа int. Вызов функции в этом случае будет выглядеть следующим образом:

(* fpointer)(3,4);

Здесь используется операция разадресации (*), чтобы получить адрес функции, на которую ссылается указатель fpointer. Адрес функции затем используется для ее вызова.

Примеры:

/*.....* example 1 *.....*/

double *realcomp (double,double);

double a,b,*rp;

.

.

.

rp=realcomp (a,b);

/*.....* example 2 *.....*/

main ()

{

long lift(int), step(int), drop(int);

void work (int, long (*) (int));

int select, count;

.

.

.

select=1;

switch (select)

{

case 1: work (count, lift);

break;

case 2: work (count, step);

break;

case 3: work (count, drop);

default:

break;

}

}

void work (int n, long (*func) (int))

{

int i;

long j;

for (i=j=0; i<n;i++)

j+=(*func)(i);

}

В первом примере функция realcomp вызывается в операторе rp=realcomp (a,b);. Функции передается два аргумента типа double. Возвращаемая величина - указатель на тип double – присваивается rp.

Во втором примере work (count, list); функциональный вызов в функции маin посылает два аргумента к функции work: целую переменную count и адрес функции lift. Заметим, что адрес функции посылается простым заданием идентификатора функции, поскольку идентификатор вычисляется как адресное выражение. Чтобы использовать идентификатор функции подобным образом, функция должна быть объявлена или определена перед использованием идентификатора, иначе идентификатор не будет распознан. В данном примере задано forward-объявление функции work в начале функции main.

Формальный параметр funk в определении work задан как указатель на функцию, принимающую один аргумент типа int и возвращающую значение типа long. Скобки, заключающие имя параметра, требуются. Без них объявление специфицировало бы функцию, возвращающую указатель на величину типа long.

Функция work вызывает выбранную функцию в вызове

(* funk)(i);

Аргумент i посылается к вызываемой функции.