Ф-ции. Объявление ф-ции. Вызов ф-ции. Рекурсивный вызов ф-ции.
Любая программа состоит только из ф-ций. Ф-ция – это независимая совокупность объявлений и инструкций, приводящая к решению определенной задачи. Каждая ф-ция имеет имя, для вызова ф-ции. В каждой программе есть только одна ф-ция именем main, с к-рой начинается выполнение программы. При вызове ф-ции ей могут быть переданы параметры посредством переменных. Ф-ция может возвращать значение, это значение- оновной результат ф-ции. С использованием ф-ции в Си связаны: 4)определение ф-ции 5)объявление ф-ции 6)вызов ф-ции
Если ф-ция вызывается до определения ее в программе или определение ф-ции находится в другом исходном файле,то вызов ф-ции необходимо предворять объявлением ф-ции. Прототип позволяет компилятору выполнить проверку аргументов в определении и вызове ф-ции. Прототип имеет такой же формат как и определение ф-ции, он он не имеет тела ф-ции и заканчивается « ; »
Имена параметров в списке формальных параметров могут быть произвольными или отсутствовать. Поскольку такие имена имеют область действия до конца объявления и никакой нагрузки не несут. Если прототип ф-ции не задан, а встретился вызов ф-ции, то компилятор создает неявный прототип. В этом случае ф-ция имеет тип , возвращающий значения int и класс памяти extern. Обычно прототипы помещаются перед main, иногда их выносят в отдельный заголовочный файл, подключаемый директивой #include.
Int rus(unsigned char c)
{ if (c>=’A’)&&(c<=’ё’)
return 1;
else return 0;
}
это сама ф-ция, а е прототип выглядит так :
int rus (unsigned char);
Вызов
Любая программа состоит только из ф-ций. Ф-ция – это независимая совокупность объявлений и инструкций, приводящая к решению определенной задачи. Каждая ф-ция имеет имя, для вызова ф-ции. В каждой программе есть только одна ф-ция именем main, с к-рой начинается выполнение программы. При вызове ф-ции ей могут быть переданы параметры посредством переменных. Ф-ция может возвращать значение, это значение- оновной результат ф-ции.
С использованием ф-ции в Си связаны:
4) определение ф-ции
5) объявление ф-ции
6) вызов ф-ции
Вызов ф-ции имеет формат
выр ([список_выр])
Выражение вычисляется как адрес ф-ции. Список_выражений представляет собой список фактических аргументов, к-рый может быть пустым.
Выполнение вызова ф-ции происходит следующим образом:
1.Вычисляется выражение в списке выражений и производится необходимое преобразование
Ф-ции. Объявление ф-ции. Вызов ф-ции. Рекурсивный вызов ф-ции.
типов. Если известен прототип ф-ции, то тип результирующего выражения сравнивается с типом соответствующего формального параметра и если они не совпадают, то результат приводится к типу формального параметра либо выдается предупреждение. 2.Происходит присвоение значений фактических аргументов формальным параметрам. Они копируются в стек, при этом 1-ый аргумент соответствует 1-ому формальному параметру, и т.д. 3.Управление передается на первый оператор ф-ции. 4.Управление передается в точку вызова после выполнение оператора return
Вывод: Вызываемая ф-ция работает с копией фактически аргументов, поэтому никакое изменение значений формальных параметров на значения аргументов, с которых была сделана копия ???. Т.е. формальные и фактические параметры изолированы друг от друга.
В общем случае существует два стиля передачи параметров ф-ции :
Call – by – value
(c передачей значений параметров ф-ции)
Используетя когда оьъем передаваемых данных ф-ции не велик и ф-ция не возвращает большой объем данных.
Call - by – reference
(с передачей адресов переменной)
В качестве параметров ф-ции передаются копии адресов переменных, благодоря чему ф-ция получает доступ к адресам переменных, вызывающихся в программе. Это позволяет внутри ф-ции изменять значения переменных. Этот способ позволяет разрабатывать ф-ции,имеющие доступ к массивам и др. протяженным объектам данных. Если в качестве параметра ф-ции используется имя массива, то в ф-цию передается не сам массив, а адрес начала его расположения в памяти.
Рекурисвные ф-ции.
Любая ф-ция в Си может быть вызвана рекурсивно. При каждом вызове для формальных параметров и переменных с классом памяти auto, register выделяется новая память. Переменные с классом памяти static не требуют новой памяти при каждом рекурсивном вызове. Параметры предыдущих незавершенных вызовов не затираются, но при этом они не доступны. Допустимо любое число рекурсивных ф-ций.
Пр: n!= 1 n=0
n(n-1)! n>0
long fact(int n )
{ return (n < = 1)? 1 : n*fact(n-1);
}