Руководство полного чайника по программированию на языке Си


КАК ПРОИСХОДИТ ВЫЗОВ ФУНКЦИИ


КАК ПРОИСХОДИТ ВЫЗОВ ФУНКЦИИ ============================

Пусть у нас описана функция, возвращающая целое значение.

/* ОПРЕДЕЛЕНИЕ ФУНКЦИИ func(). */ /* Где func - ее имя. Назвать мы ее можем как нам угодно. */

int func(int a, int b, int c){ int x, y;

... x = a + 7; ... b = b + 4; ...

return(некое_значение); }

Здесь a, b, c - аргументы функции (параметры) x, y - локальные переменные

Точка вызова - находится внутри какой-то другой функции, например функции main()

main(){

int zz, var; ... var = 17; zz = func(33, 77, var + 3) + 44; ... }

Когда выполнение программы доходит до строки

zz = func(33, 77, var + 3) + 44;

1) Происходит ВЫЗОВ ФУНКЦИИ func()

(a) Этот пункт мы увидим ниже.

(b) Создаются переменные с именами a, b, c, x, y;

(c) Переменным-аргументам присваиваются начальные значения, которые берутся из точки вызова. В точке вызова перечислен список (через запятую) выражений (формул):

func(выражение1, выражение2, выражение3)

Вычисленные значения этих выражений соответственно будут присвоены 1-ому, 2-ому и 3-ему аргументам (параметрам) из определения функции:

int func(a, b, c){ /* a = номер 1, b = 2, c = 3 */

Первый параметр:

a = 33;

Второй параметр:

b = 77;

Третий параметр:

c = var + 3;

то есть, вычисляя,

c = 20;

Локальные переменные x и y содержат неопределенные значения, то есть мусор (мы не можем предсказать их значения, пока не присвоим им явным образом какое-либо значение сами).

2) Выполняется ТЕЛО функции, то есть вычисления, записанные внутри { ... } в определении функции. Например:

x = a + 7;

И параметры, и локальные переменные - это ПЕРЕМЕННЫЕ, то есть их можно изменять.

b = b + 4;

При этом никакие переменные ВНЕ этой функции не изменяются. (Об этом еще раз позже).

3) Производится ВОЗВРАТ из функции.

... return(некое_значение); }

Например, это может быть

... return(a + 2 * x); }

Рассмотрим, что при этом происходит в точке вызова:

zz = func(33, 77, var + 3) + 44;

(1) Вычеркиваем func(.....)

zz = XXXXXXX + 44;

(2) Вычисляем значение "некое_значение" в операторе return, и берем КОПИЮ этого значения. Пусть при вычислении там получилось 128.




- Начало -  - Назад -  - Вперед -