- •Введение
- •Язык программирования Си Элементы языка программирования.
- •Множества символов
- •Буквы и цифры
- •Пробельные символы
- •Знаки пунктуации и специальные символы
- •Операции
- •Константы
- •Целые константы
- •Константы с плавающей точкой
- •Константа-символ
- •Строковые литералы
- •Идентификаторы
- •Ключевые слова
- •Комментарии
- •Лексемы
- •Структура программы
- •Исходная программа
- •Исходные файлы
- •Выполнение программ
- •Время жизни и видимость
- •Классы имен
- •Объявления
- •Спецификаторы типов
- •Область значений величин
- •Деклараторы
- •Деклараторы массивов, функций и указателей
- •Составные деклараторы
- •Объявления переменной
- •Объявление простой переменной
- •Объявление перечисления
- •Объявления структур
- •Объявление совмещений
- •Объявление массива
- •Объявление указателей
- •Объявление функций
- •Объявление классов
- •Классы памяти
- •Объявления переменной на внешнем уровне
- •Объявление переменной на внутреннем уровне
- •Объявление функции на внешнем и внутреннем уровнях
- •Инициализация
- •Базовые типы и типы указателей
- •Составные типы
- •Строковые инициализаторы
- •Объявления типов
- •Типы структур, совмещений и перечислений
- •Объявления typedef
- •Имена типов
- •Выражения и присваивания
- •Введение
- •Операнды
- •Константы
- •Идентификаторы
- •Вызовы функций
- •Индексные выражения
- •Выражение выбора структурного элемента
- •Выражения с операциями
- •Выражения в скобках
- •Type-cast выражения
- •Константные выражения
- •Операции
- •Обычные арифметические преобразования.
- •Операции дополнения
- •Операция адресации и разадресации
- •Операция sizeof
- •Мультипликативные операции
- •Аддитивные операции
- •Операции сдвига
- •Операции отношений
- •Побитовые операции
- •Логические операции
- •Операция последовательного вычисления
- •Условная операция
- •Операции присваивания
- •Lvalue-выражения
- •Унарные инкремент и декремент
- •Простое присваивание
- •Составное присваивание
- •Старшинство и порядок выполнения
- •Побочные эффекты
- •Преобразования типов
- •Преобразование типов при присваивании
- •Преобразования type-cast
- •Преобразования, выполняемые операциями
- •Преобразования при вызовах функций
- •Операторы
- •Введение
- •Оператор break
- •Составной оператор
- •Оператор continue
- •Оператор do
- •Оператор-выражение
- •Оператор for
- •Goto и помеченные операторы
- •Оператор if
- •Оператор null
- •Оператор return
- •Оператор switch
- •Оператор while
- •Функции
- •Введение
- •Определение функции
- •Класс памяти
- •Тип возврата
- •Формальные параметры
- •Тело функции
- •Объявления функции
- •Вызовы функций
- •Фактические аргументы
- •Вызовы с переменным числом аргументов
- •Рекурсивные вызовы
- •Директивы препроцессора и указания компилятору
- •Поименованные константы и макросы
- •Директива # define
- •Директива #undef
- •#Include файлы
- •Условная компиляция
- •Директивы #if, #elif, #else, #endif
- •Директивы #ifdef и #ifndef
- •Управление нумерацией строк
Тело функции
Тело функции - это просто составной оператор. Составной оператор содержит операторы, которые определяют действия функции, и может также содержать объявления переменных, используемых в этих операторах. Информацию о составных операторах смотри в разделе 6.3. Все переменные, объявленные в теле функции, имеют тип памяти auto, если они не объявлены иначе. Когда вызывается функция, то создается память для локальных переменных и производится их инициализация (если она задана). Управление передается первому оператору составного оператора и начинается процесс выполнения, который продолжается до тех пор, пока не встретится оператор return или конец тела функции. Управление при этом возвращается в точку вызова.
Если функция возвращает значение, то должен быть выполнен оператор return, содержащий выражение. Значение возврата не определено, если не выполнен оператор return или если в оператор return не было включено выражение.
Объявления функции
Объявление функции определяет имя, типа аргументов, тип возврата и класс памяти данной функции. Детальное описание синтаксиса объявлений функции дано в разделе 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-объявлении и также соответствуют типам формальных параметров.