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

Тело функции - это просто составной оператор. Составной оператор содержит операторы, которые определяют действия функции, и может также содержать объявления переменных, используемых в этих операторах. Информацию о составных операторах смотри в разделе 6.3. Все переменные, объявленные в теле функции, имеют тип памяти auto, если они не объявлены иначе. Когда вызывается функция, то создается память для локальных переменных и производится их инициализация (если она задана). Управление передается первому оператору составного оператора и начинается процесс выполнения, который продолжается до тех пор, пока не встретится оператор return или конец тела функции. Управление при этом возвращается в точку вызова.

Если функция возвращает значение, то должен быть выполнен оператор return, содержащий выражение. Значение возврата не определено, если не выполнен оператор return или если в оператор return не было включено выражение.

    1. Объявления функции

Объявление функции определяет имя, типа аргументов, тип возврата и класс памяти данной функции. Детальное описание синтаксиса объявлений функции дано в разделе 4. Функции могут быть объявлены неявно или в forward-объявлениями. Тип возврата функции, объявленный или неявно или в forward-объявлении, должен соответствовать типу возврата в определении функции. Неявное объявление имеет место всякий раз, когда функция вызывается без предварительного объявления или определения. Си-компилятор неявно объявляет вызываемую функцию с типом возврата int. По умолчанию функция объявляется с классом памяти extern. Определение функции может переопределить класс памяти на static, обеспечив себе появление ниже объявлений в том же самом исходном файле. Forward-объявление функции устанавливает ее атрибуты, позволяя вызывать объявленную функцию перед ее определением или из другого исходного файла.

Если спецификатор класса памяти static задается в forward-объявлении, то функция имеет класс static. Поэтому определение функции должно быть также специфицировано классом памяти static.

Если задан спецификатор класса памяти extern или спецификатор опущен, то функция имеет класс памяти extern. Однако определение функции может переопределить класс памяти на static, обеспечив себе появление ниже объявлений в том же самом исходном файле

Forward-объявление имеет важные различные применения. Они задают тип возврата для функций, которые возвращают любой тип значений, за исключением int. (Функции, которые возврщают значение int, могут также иметь forward-объявления, но делать это не требуется).

Если функция с типом возврата не int вызывается перед ее определением или объявлением, то результат неопределен. Forward-объявления могут быть использованы для задания типов аргументов, ожидаемых в функциональном вызове.

Список типов аргументов forward-объявления задает тип и число предполагаемых аргументов. (Число аргументов может меняться). Список типов аргументов - это список имен типов, соответствующих списку выражений в функциональном вызове.

Если список типов аргументов не задан, то не производится контроль типов. Несоответствие типов между действительными аргументами и формальными параметрами разрешено. Более детально контроль типов рассмотрен в разделе 7.4.1 "Действительные аргументы".

Пример:

main ()

{

int a=0, b=1;

float x=2.0, y=3.0;

double realadd (double,double);

a=intadd (a,b);

x=realadd (x,y);

}

intadd (int a, int b)

{

return (a+b);

}

double realadd (double x, double y)

{

return (x+y);

}

В примере функция intadd объявлена неявно с возвратом типа int, т.к. она вызвана перед своим определением. Компилятор не проверит типы аргументов в вызове, т.к. отсутствует список типов аргументов.

Функция realadd возвращает значение типа double. Forward-объявление realadd в функции main позволяет вызвать realadd перед ее определением. Заметим, что тип возврата в определении (double) соответствует типу возврата, заданному в forward-объявлении. В forward-объявлении также определены типы двух параметров функции realadd. Типы действительных аргументов соответствуют типам заданным в forward-объявлении и также соответствуют типам формальных параметров.