Определение функции

Каждая функция в языке Си должна быть определена, то есть должны быть указаны:

· тип возвращаемого значения;

· имя функции;

· информация о формальных аргументах;

· тело функции.


Определение функции имеет следующий синтаксис:

 

ТипВозвращаемогоЗначения ИмяФункции(СписокФормальныхАргументов)
{
ТелоФункции;
...
return(ВозвращаемоеЗначение);
}

 


 

Пример: Функция сложения двух вещественных чисел

float function(float x, float z)
{
float y;
y=x+z;
return(y);
}


В указанном примере возвращаемое значение имеет тип float. В качестве возвращаемого значения в вызывающую функцию передается значение переменной y. Формальными аргументами являются значения переменных x и z.

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

Различают системные (в составе систем программирования) и собственные функции.

Системные функции хранятся в стандартных библиотеках, и пользователю не нужно вдаваться в подробности их реализации. Достаточно знать лишь их сигнатуру. Примером системных функций, используемых ранее, являются функции printf() и scanf().

Собственные функции - это функции, написанные пользователем для решения конкретной подзадачи.

Разбиение программ на функции дает следующие преимущества:

· Функцию можно вызвать из различных мест программы, что позволяет избежать повторения программного кода.

· Одну и ту же функцию можно использовать в разных программах.

· Функции повышают уровень модульности программы и облегчают ее проектирование.

· Использование функций облегчает чтение и понимание программы и ускоряет поиск и исправление ошибок.


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

 

Вызов функции

Общий вид вызова функции

 

Переменная = ИмяФункции(СписокФактическихАргументов);


Фактический аргумент — это величина, которая присваивается формальному аргументу при вызове функции. Таким образом, формальный аргумент — это переменная в вызываемой функции, а фактический аргумент — это конкретное значение, присвоенное этой переменной вызывающей функцией. Фактический аргумент может быть константой, переменной или выражением. Если фактический аргумент представлен в виде выражения, то его значение сначала вычисляется, а затем передается в вызываемую функцию. Если в функцию требуется передать несколько значений, то они записываются через запятую. При этом формальные параметры заменяются значениями фактических параметров в порядке их следования в сигнатуре функции.

Если функция использует аргументы, то в ней должны объявляться переменные, которые будут принимать значения аргументов. Данные переменные называются формальными параметрами функции. Они ведут себя, как любые другие локальные переменные в функции. Как показано в следующем фрагменте программы, они объявляются в круглых скобках, следующих за именем функции.

/* возвращает 1, если с является частью строки s; в противном случае - 0 */

int is_in (char *s, char c) {

while(*s)

if(*s==c) return 1;
else s++;

return 0;

}

Функция is_in() имеет два параметра: s и с. Необходимо сообщить компилятору тип этих переменных, как показано выше. Когда это сделано, они могут использоваться в функции как обычные локальные переменные. Надо помнить, что локальные переменные также являются динамическими и уничтожаются при выходе из функции.

Как и с локальными переменными, формальным параметрам можно присваивать значения или использовать их в любых допустимых выражениях С. Даже если эти переменные играют особую роль для некоторых задач по получению значений аргументов, переданных в функцию, то они могут использоваться, как и остальные локальные переменные.