Справочная система C guide



         

Вызов функции


Существуют два способа вызова функции:

имя_функцш (е1, е2,. .., eN)

(указатель _на_функцию) (е1, е2,..., eN) Указатель _на_функцию - это переменная, содержащая адрес функции. Адрес функции может быть присвоен указателю оператором

указатель_на_функцию = имя _функции;

Аргументы (фактические параметры) передаются по значению, т. е. каждое выражение el, . . . , eN вычисляется и значение передается функции, например, загрузкой в стек. Порядок вычисления выражений и порядок загрузки значений в стек не гарантируются. Во время выполнения не производится проверка числа или типа аргументов, переданных функции. Такую проверку можно произвести с помощью программы lint до компиляции (см. с. 78). Вызов функции - это выражение, значением которого является значение, возвращаемое функцией. Описанный тип функции должен соответствовать типу возвращаемого значения. Например, если функция linfunc возвращает значение типа double, то эта функция должна быть описана до вызова:

extern double ' linfunc();

Замечание. Такое описание не определяет функцию, а только описывает тип возвращаемого значения; оно не нужно, если функция определена в том же файле до ее вызова (см. с. 42).

Примеры

Правильно: extern double linfuncO;

float у;

у = linfunc (3.05, 4.0, le-3), Значение функции перед присваиванием переменной у преобразуется из типа double в тип float.

Неправильно: float х;

float у;

х=3.05;

у = linfunc (х, 4, le-3);

Тип аргументов не соответствует типу параметров, описанных в определении функции, а именно: константа 4 имеет тип int, а не double. В результате аргументы, загруженные в стек, имеют неправильные тип и формат, поэтому значения, выбираемые из стека, бессмысленны и значение, возвращаемое функцией, не определено. Кроме того, если тип функции не описан, то считается, что возвращаемое значение имеет тип int. Поэтому, даже если функция linfunc возвращает правильное значение типа double, выражение, представляющее вызов функции, получит бессмысленное значение типа int (например, старшая половина значения double).




Содержание  Назад  Вперед