Определение, описание и вызов функции
Следует различать определение функции, описание функции (заголовок) и вызов функции.
Формат определения функции:
[<модификаторы>] <тип_возвращаемого_значения> <имя_функции>([<спецификация_формальных_параметров>])
{ <тело_функции> }
Спецификация формальных параметров в круглых скобках определяет параметры функции, один параметр отделяется от другого запятой. Спецификация формальных параметров имеет следующий формат:
<тип1> [<имя1>][=<умалчиваемое_значение>], <тип2> [<имя2>][=<умалчиваемое_значение>],…
Формальные параметры функции могут отсутствовать в этом случае после имени функции идут пустые скобки (или в скобках может быть ключевое слово void). Имя формального параметра может отсутствовать, если этот параметр пока не используется в теле функции, но зарезервирован на будущее.
Тело функции является блоком, в нем локализованы формальные параметры заголовка. Важным оператором тела функции является оператор return, наличие данного оператора обязательно, если тип возвращаемого значения отличен от void. Если функция возвращает некоторое значение, то она может вызываться внутри оператора- выражения в любом месте, где разрешено использовать значение данного типа.
В качестве модификаторов функции может присутствовать модификатор класса памяти extern или static. По умолчанию у функции класс памяти extern. Если функция определена с ключевым словом static, то функцию можно использовать только в том файле, где она определена.
Функция может быть определена только один раз, определение функции может находиться в отдельном файле, но чтобы ее использовать в другом файле (или в том же файле, но выше места определения) необходимо до вызова функции включить описание функции. Описание функции, по сути, является заголовком функции без тела, оно имеет формат:
[<модификаторы>] <тип_возвращаемого_значения> <имя_функции>
(<спецификация_формальных_параметров>);
Примечание. Стандартные заголовочные файлы stdio.h, stdlib.h, math.h и др. содержат описания или заголовки стандартных функций, поэтому их необходимо подключать, если требуется вызывать стандартные функции, описанные в заголовочных файлах.
Совокупность формальных параметров определяет сигнатуру функции. В описании имена параметров можно не использовать, важно количество и типы параметров. Также в описании не должны присутствовать умалчиваемые значения параметров, если они есть в определении функции.
Пример простой функции, которая возвращает сумму двух свои параметров:
double summa(double x, double y)
{
return x+y;
}
Описание или заголовок этой функции имеет вид:
double summa(double, double);
Вызов функции имеет следующий формат (вызов функции часто выполняется внутри оператора- выражения):
<имя_функции>(<список_факт_параметров>);
При вызове функции вместо формальных параметров подставляются фактические параметры (переменные, константы, указатели и др.) и выполняются операторы тела функции со значениями фактических параметров.
Следует отметить, что функция может вызываться «как функция», когда используется возвращаемое значение и функция вызывается внутри выражения:
S=summa(a, b); // Переменной S присваивается значение, возвращаемое функцией
Функция может вызываться «как процедура», когда возвращаемой значение не используется (если оно вообще не нужно, можно объявить тип void):
printf(“x=%f”, x); // Функция printf возвращает значение типа int,
// но оно не используется