logo
Подбельский Фомин_Программирование на языке СИ_

5.1. Общие сведения о функциях Определение функции.

Определение функции. В соответствии с синтаксисом в языке Си определены три производных типа: массив, указатель, функция. В этой главе рассмотрим функции.

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

тип имя_функции (спецификация_параметров) тело_функции

Первая строка - это, по существу, заголовок функции, который отличается от ее прототипа только отсутствием точки с запятой в конце и обязательным присутствием имен формальных параметров.

Здесь тип либо void (для функций, не возвращающих значения), либо обозначение типа возвращаемого функцией значения. В предыдущих главах рассмотрены функции, возвращающие значения базовых типов (char, int, double и т.д.).

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

Спецификация_параметров - это либо пусто, либо список формальных параметров, каждый элемент которого имеет вид:

обозначение_тuna имя_параметра

Примеры спецификаций параметров уже приводились для случаев, когда параметры были базовых типов или массивами. Список параметров функции может заканчиваться запятой с последующим многоточием "...". Многоточие обозначает возможность обращаться к функции с большим количеством фактических параметров, чем явно указано в спецификации параметров. Такая возможность должна быть "подкреплена" специальными средствами в теле функции. В следующих параграфах этой главы особенности подготовки функций с переменным количеством параметров будут подробно рассмотрены. Сейчас отметим, что мы уже хорошо знакомы с двумя библиотечными функциями, допускающими изменяемое количество фактических параметров. Вот их прототипы:

int printf (char * format, ...);

int scanf (char * format, ...);

Указанные функции форматированного вывода и форматированного ввода позволяют применять теоретически неограниченное количество фактических параметров. Обязательным является только параметр char * format - "форматная строка", внутри которой с помощью спецификаций преобразования определяется реальное количество параметров, участвующих в обменах.

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

Обязательным, но не всегда явно используемым оператором тела функции является оператор возврата из функции в точку вызова, имеющий две формы:

return;

return выражение;

Первая форма соответствует завершению функции, не возвращающей никакого значения, т.е. функции, перед именем которой в ее определении указан тип void. Выражение во второй форме оператора return должно иметь тип, указанный перед именем функции в ее определении, либо иметь тип, допускающий автоматическое преобразование к типу возвращаемого функцией значения.

Мы отметили обязательность оператора возврата из тела функции, однако оператор return программист может явно не использовать в теле функции, возвращающей значение типа void (ничего не возвращающей). В этом случае компилятор автоматически добавляет оператор return в конец тела функции перед закрывающейся фигурной скобкой "}".

Итак, в языке Си допустимы функции с параметрами и без параметров, функции, возвращающие значения указанного типа и ничего не возвращающие.

Завершая рассмотрение определения функции, укажем на допустимость в языке Си "старой" формы:

тип имя_фупкции (список_параметров)

спецификация _параметров;

тело_функции

Следующие два определения функций эквивалентны, но мы рекомендуем использовать только первую стандартную форму:

Как видно из примера, в устаревшей форме определения функций список параметров не содержит сведений об их типах. Эти сведения помещаются во вторую часть заголовка функции. Тело функции в обоих формах определения одинаково.