В отличие от других ЯП в С нет деления на подпрограммы, процедуры и функции.
В языке С программа состоит только из функций.
Функция - независимая совокупность объявлений операторов, обычно предназначенная для выполнения определенной задачи.
Каждая функция должна иметь имя.
main, Winmain, Qumain - функции, с которых начинается программа.
При вызове функции ей могут быть переданы данные посредством аргументов.
Функция может возвращать значения, однако могут быть функции, которые не получают аргументов и не возвращают значений.
С использованием функций связано три понятия:
1)Определение функции
2)Объявление функции
3)Вызов функции
Пример:
int IfRus(char c)
{
if (c>="А" && c<="я") Return 1;
else Return 0;
}
Объявление функции без тела программы называется прототипом.
int IfRus(char c)
В прототипе необязательно указывать имена переменных.
Общий формат определения функций:
[спецификатор типа] Имя [(список параметров)]
Если спецификатор типа не используется, то считается, что функция возвращает int
Список параметров - последовательность объявлений формальных параметров, разделенных запятыми.
Формальные параметры - переменные, которые принимают значения, переданные функции во время вызова.
Имя(, …) - у функции переменное число аргументов.
Однако для таких функций предполагается, что функция имеет по крайней мере столько аргументов, сколько формальных параметров задано перед , …
Если функция не возвращает значений, то спецификатор типа = void
Общий формат вызова функции:
выражение ([список выражений])
Рекурсивные вызовы.
Любая функция может быть вызвана рекурсивно, то есть она может вызывать саму себя.
Компилятор допускает любое число рекурсивных вызовов. Параметры, предшествующие незавершенным рекурсивным вызовам, недоступны.
long Fact(int n)
{
Return (n<=1)?1: n*Fact(n-1);
Вызов функции с переменным числом аргументов.
В вызове функции задается любое число аргументов, все аргументы помещаются в стеке. Программист сам отвечает за выбор доп-х аргументов из стека и определение их кол-ва.
va_start, va_arg, va_end, va_list
int average (int first
{
int count=0, sum=0, i=first;
va_list marker;
va_start (marker,first);
while (i:=-1)
{
sum+=i; count++;
i=va_arg(marker,int);
}
va_end(marker);
return (sum?(sum/count):0);
}
int A
A=average(1,2,3,4,-1)