Указание типа возвращаемого значения в определении функции необязательно, если это тип int. При другом типе возвращаемого значения необходимо указать этот тип в объявлении функции. К моменту вызова функции тип ее возвращаемого значения должен быть известен, поэтому перед вызовом может потребоваться предварительное объявление функции с указанием типа ее возвращаемого значения.
Вызов функции передает управление от вызывающей функции к вызываемой. Значения фактических аргументов, если они есть, передаются в вызываемую функцию. При выполнении оператора возврата returnв вызываемой функции управление и возвращаемое значение (если оно есть) передаются в вызывающую функцию.
Определение функции специфицирует имя, формальные параметры и тело функции. Оно может также специфицировать тип возвращаемого значения и класс памяти функции. Синтаксис определения функции следующий:
[< спецификация КП >][< спецификация типа >]
< описатель > ([< список объявлений параметров >]) < тело функции >
< тело функции >
Спецификация класса памяти < спецификация КП > задает класс памяти функции. < Спецификация типа > в совокупности с описателем определяет тип возвращаемого значения и имя функции. < Список объявлений параметров > аналогичен списку типов аргументов в прототипе функции (см. раздел 3.5 "Объявление функции"). Он содержит объявления формальных параметров через запятую. Однако если в прототипе область действия идентификаторов ограничена этим же прототипом, то в списке объявлений параметров идентификаторы именуют формальные параметры данной функции. Их область действия — тело функции. < Тело функции > — это составной оператор, содержащий объявления локальных переменных и операторы.
В следующих разделах детально описываются перечисленные элементы определения функции.
В определении функции допускается указание спецификации класса памяти staticили extern. Классы памяти функций рассматривались в разделе 3.6.
Модификаторы типа функции
Компилятор языка Си поддерживает ряд модификаторов типа функций: pascal, cdecl, interrupt, near, farи huge(модификатор interruptне реализован в версии 4 СП MSC). Модификаторы рассмотрены в разделе 3.3.3 "Описатели с модификаторами".
Типы возвращаемых значений
Синтаксис задания типа возвращаемого значения функции описан в разделе 3.5 "Объявление функции", функция может возвращать значение любого типа, кроме массива или функции; она может, в частности, возвращать указатель на любой тип, включая массив и функцию.
Тип возвращаемого значения, задаваемый в определении функции, должен соответствовать типу возвращаемого значения во всех объявлениях этой функции, если они имеются в программе. Для вызова функции с типом возвращаемого значения intне требуется ее предварительно объявлять или определять. Функции с другими типами возвращаемого значения должны быть определены или объявлены до того, как они будут вызваны.
Возвращаемое значение функции вырабатывается при выполнении оператора возврата return, содержащего выражение. Выражение вычисляется, преобразуется к типу возвращаемого значения и возвращается в точку вызова функции. Если оператор returnотсутствует или не содержит выражения, то возвращаемое значение функции не определено. Если в этом случае вызывающая функция ожидает возвращаемое значение, то поведение программы непредсказуемо.
Примеры:
/* пример 1 */
/* тип возвращаемого значения int */
static add(int х, int у)
{
return (х + у);
}
/* пример 2 */
/* тип возвращаемого значения STUDENT */
typedef struct {
char name [20],
int id;
long class;
} STUDENT;
STUDENT sortstu(STUDENT a, STUDENT b)
{
return (a.id < b.id ? a : b);
}
/* пример 3 */
/* тип возвращаемого значения — указатель на char */
char *smallstr(char *s1, char *s2)
{
int i;
i = 0;
while(s1[i] != '\0' && s2[i] != '\0')
i++;
if(s1[i] == '\0')
return (s1);
else
return (s2);
}
В первом примере по умолчанию тип возвращаемого значения функции addопределен как int. Функция имеет класс памяти static. Это значит, что она может быть вызвана только функциями того же исходного файла, в котором она определена.
Во втором примере посредством объявления typedefсоздан структурный тип STUDENT. Далее определена функция sortstuс типом возвращаемого значения STUDENT, функция возвращает тот из своих двух аргументов структурного типа, элемент idкоторого меньше.
Читать дальше