В С определены три производных типа:
§ массив
§ указатель
§ функция.
Функцию следует рассматривать с двух точек зрения:
§ функция – это один из производных типов данных,
§ функция – это минимальный исполняемый модуль программы на языке С.
Все функции в языке С имеют следующий формат определения:
<тип> <имя_функции> (<спецификация параметров>)
<тело функции>
Здесь
<тип> -
§ void (для функций, не возвращающих значения),
§ обозначение типа возвращаемого функцией значения.
<имя_функции> -
§ main для основной (главной) функции программы,
§ произвольно выбираемое программистом имя (идентификатор).
<спецификация параметров> -
§ это либо пусто,
§ либо список формальных параметров, каждый элемент которого имеет вид:
<обозначение_типа> <имя_параметра>
По сравнению с уже известными способами определения формальных параметров, существует возможность завершения списка параметров запятой с последующим многоточием «, …». Это означает, что при обращении к функции может быть указано большее число фактических параметров. Так, известные функции printf и scanf имеют прототипы:
int printf (const char *format, …);
int scanf (const char *format, …);
Указанные функции позволяют применять теоретически неограниченное количество фактических параметров. Обязательным является только параметр char *format – «форматная строка», внутри которой с помощью спецификаций преобразования определяется реальное количество параметров, участвующих в обменах.
<тело функции> - это часть определения функции, представляющая программный блок, т.е. ограниченный фигурными скобками фрагмент текста на языке С, размещенный непосредственно вслед за заголовком функции. Особенность С состоит в невозможности внутри тела функции определить другую функцию: определения функций не могут быть вложенными.
Для завершения (прерывания) работы функции служит оператор return. Существует две формы этого оператора:
§ return; // Возврат без передачи результата
§ return <выражение>; // Возврат значения
Первая форма используется для функций, перед именем которой в определении указан тип void. Для функций этого типа оператор return можно в тексте программы не писать вовсе – компилятор встроит его автоматически перед закрывающей фигурной скобкой тела функции.
<выражение> во второй форме оператора должно иметь тип, совпадающий с типом функции или допускающий автоматическое преобразование к типу возвращаемого функцией значения.
Описание функций
Для корректного обращения к функции сведения о ней должны быть известны компилятору, т.е. до вызова функции в том же файле рекомендуется помещать ее описание – прототип:
<тип> <имя_функции>(<спецификация параметров>);
В отличие от заголовка функции в ее прототипе могут не указываться имена формальных параметров, например эквивалентны
double Func(int n, double x);
double Func(int, double);