Возврат в вызывающую функцию
По окончании выполнения вызываемой функции осуществляется возврат значения в точку ее вызова. Это значение присваивается переменной, тип которой должен соответствовать типу возвращаемого значения функции. Функция может передать в вызывающую программу только одно значение. Для передачи возвращаемого значения в вызывающую функцию используется оператор return в форме
Return (Возвращаемое Значение);
Действие оператора следующее: значение выражения, заключенного в скобки, вычисляется и передается в вызывающую функцию. Возвращаемое значение может использоваться в вызывающей программе как часть некоторого выражения.
Оператор return также завершает выполнение функции и передает управление следующему оператору в вызывающей функции. Оператор return не обязательно должен находиться в конце тела функции.
Функции могут и не возвращать значения, а просто выполнять некоторые вычисления. В этом случае указывается пустой тип возвращаемого значения void, а оператор return может либо отсутствовать, либо не возвращать никакое значение:
return;
Пример Посчитать сумму двух чисел.
#include <stdio.h>
int sum(int x, int y)
{
int k;
k = x + y;
return(k);
}
int main()
{
int a, r;
printf("a= ");
scanf("%d",&a);
r = sum(a, 5); // вызов функции: x=a, y=5
printf("%d + 5 = %d",a, r);
getchar();getchar();
return(0);
}
В языке Си нельзя определять одну функцию внутри другой.
В языке Си нет требования, чтобы семантика функции обязательно предшествовало её вызову. Функции могут определяться как до вызывающей функции, так и после нее. Однако если семантика вызываемой функции описывается ниже ее вызова, необходимо до вызова функции определить прототип этой функции, содержащий:
· тип возвращаемого значения;
· имя функции;
· типы формальных аргументов в порядке их следования.
Прототип необходим для того, чтобы компилятор мог осуществить проверку соответствия типов передаваемых фактических аргументов типам формальных аргументов. Имена формальных аргументов в прототипе функции могут отсутствовать.
Пример
#include <stdio.h>
int sum(int, int); // сигнатура
int main()
{
int a, r;
printf("a= ");
scanf("%d",&a);
r = sum(a, 5); // вызов функции: x=a, y=5
printf("%d + 5 = %d",a, r);
getchar();getchar();
return 0;
}
int sum(int x, int y) {
int k; // семантика
k = x + y;
return(k);
}
Рекурсивные функции
Функция, которая вызывает сама себя, называется рекурсивной функцией.
Рекурсия - вызов функции из самой функции.
Пример рекурсивной функции - функция вычисления факториала.
#include <stdio.h>
int fact(int num)
{
if(num==1) return(1);
else return(num*fact(num-1)); // рекурсивный вызов
}
int main()
{
int a, r;
printf("a= ");
scanf("%d",&a);
r = fact(a);
printf("%d! = %d",a,r);
getchar();getchar();
return(0);
}
Математические функции
Математические функции хранятся в стандартной библиотеке math.h. Аргументы большинства математических функций имеют тип double. Возвращаемое значение также имеет тип double. Углы в тригонометрических функциях задаются в радианах.
Основные математические функции стандартной библиотеки.
Функция | Описание |
int abs(int x) | Модуль целого числа x |
double acos(double x) | Арккосинус x |
double asin(double x) | Арксинус x |
double atan(double x) | Арктангенс x |
double cos(double x) | Косинус x |
double cosh(double x) | Косинус гиперболический x |
double exp(double x) | Экспонента x |
double fabs(double x) | Модуль вещественного числа |
double fmod(double x, double y) | Остаток от деления x/y |
double log(double x) | Натуральный логарифм x |
double log10(double x) | Десятичный логарифм x |
double pow(double x, double y) | x в степени y |
double sin(double x) | Cинус x |
double sinh(double x) | Cинус гиперболический x |
double sqrt(double x) | Квадратный корень x |
double tan(double x) | Тангенс x |
double tanh(double x) | Тангенс гиперболический x |
Область видимости объектов и модификация
Область видимости объекта (переменной или функции) определяет набор функций или модулей, внутри которых допустимо использование имени этого объекта. Область видимости объекта начинается в точке объявления объекта.