Определение функций.Как уже было отмечено, каждая программа на языке Си - это совокупность функций. В определении функции указываются последовательность действий, выполняемых при обращении к функции, имя функции, тип результата (возвращаемого значения) и совокупность формальных параметров, заменяемых при обращении к функции фактическими параметрами (аргументами).
"Описание и определение функций - это та область, где стандартом ANSI в язык внесены самые существенные изменения" [2]. Так как многие компиляторы были написаны до ввода стандартов, а многие современные компиляторы позволяют использовать два варианта определения и описания функций, не будем ограничиваться только вариантом, рекомендуемым стандартом языка. Это целесообразно, так как "достандартный" (нестандартный) вариант часто встречается в опубликованных ранее текстах программ и нужно уметь их читать. Начнем в исторической последовательности с нестандартного определения функции, однако отметим еще раз, что стандарт допускает два варианта определения.
Действия, выполняемые при обращении к функции, задает ее тело - составной оператор (блок), обязательным элементом которого служат внешние фигурные скобки { }. Имя функции, тип результата, совокупность параметров и их свойства задают заголовок функции. Структура классического (нестандартного) определения функции:
тип результата
имя_функции (список_формальных _параметров)
спецификация _формалъных_параметров
{
определения_объектов
исполняемые _операторы
}
Здесь первые три строки - заголовок, последние четыре -тело функции.
В этой главе будем рассматривать функции, возвращающие значения целого или вещественного типа. Таким образом, типом результата может быть char, int, long, float, doubleили long double.Могут быть добавлены signed и unsigned.Если тип результата не указан, то по умолчанию предполагается целый тип int. Допустимы функции, не возвращающие результата. В этом случае для них должен быть использован тип void.
Имя неглавной функции - это произвольно выбираемый идентификатор. Имя функции не должно совпадать со служебными словами, именами библиотечных функций и с другими именами в программе. Список формальных параметров - набор идентификаторов, отделяемых друг от друга запятыми. Спецификация формальных параметров определяет их свойства и во многом подобна определениям и описаниям. В данной главе будем считать, что параметр может быть специфицирован либо как простая переменная целого или вещественного типа, либо как одномерный массив (целый или вещественный). Пример рассмотренного определения функции:
В настоящее время более широко используется и рекомендуется стандартом языка Си определение функции, в котором список формальных параметров объединен с их спецификацией. Структура стандартного определения функции:
тип результата
имя_функции (спецификация _формалъных_параметров)
{
определения_объектов; исполняемые_операторы;
)
Пример той же функции:
Принципиально важным оператором тела функции является оператор возврата из функции в точку ее вызова:
returnвыражение; или
return;
Выражение в операторе возврата задает возвращаемое функцией значение. Для функции типа void,не возвращающей никакого значения, выражение в операторе returnотсутствует. В теле такой функции оператор returnможет вообще отсутствовать. В этом случае компилятор предполагает, что оператор returnнаходится в самом конце тела функции.
Применение оператора returnдопустимо и в функции main( ). Если программист явно не поместил в функцию main() оператор return,то компилятор поместит его в конце текста функции main(). В отличие от "неглавных" функций, откуда возврат выполняется в вызывающую функцию, выполнение оператора return;или returnвыражение; в функции main( ) приводит к завершению программы. Управление при таком выходе передается вызывающей программе, например операционной системе, которая может анализировать значение выражения, использованного в операторе возврата.
Приведем примеры определения функций и проиллюстрируем некоторые их особенности.