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


КАК ПРОИСХОДИТ ВЫЗОВ ФУНКЦИИ - часть 2


(3) Подставляем это значение на место вычеркнутого func(.....) У нас получается

zz = 128 + 44;

(4) АВТОМАТИЧЕСКИ УНИЧТОЖАЮТСЯ локальные переменные и аргументы функции:

a - убито b - убито c - убито x - убито y - убито

Таких переменных (и их значений) больше нет в природе.

(5) Пункт, который мы обсудим позже.

(6) Продолжаем вычисление:

zz = 128 + 44;

Вычисляется в

zz = 172; /* оператор присваивания */

int func1(int x){ printf("func1: x=%d\n", x); /* 1 */ x = 77; printf("func1: x=%d\n", x); /* 2 */ return x; }

void main(){ int var, y;

var = 111; y = func1(var); /* @ */

printf("main: var=%d\n", var); /* 3 */ }

В данном случае в точке @ мы передаем в функцию func1() ЗНАЧЕНИЕ переменной var, равное 111. Это значит, что при вызове функции будет создана переменная x и ей будет присвоено начальное значение 111

x = 111;

Поэтому первый оператор printf() напечатает 111.

Затем мы изменяем значение переменной x на 77. Мы меняем переменную x, но не переменную var !!! Использовав ЗНАЧЕНИЕ (его копию) из переменной var для x, мы о переменной var забыли - она нас не касается (а мы - ее).

Поэтому второй оператор printf() напечатает 77. В переменной же var осталось значение 111, что и подтвердит нам третий оператор printf, который напечатает 111.

ВРЕМЕННОЕ СОКРЫТИЕ ПЕРЕМЕННЫХ =============================

int func1(int x){ /* f.1 */ printf("func1: x=%d\n", x); /* f.2 */ x = 77; /* f.3 */ printf("func1: x=%d\n", x); /* f.4 */ return x; /* f.5 */ }

void main(){ int x, y; /* 1 */

x = 111; /* 2 */ y = func1(x); /* 3 */

printf("main: x=%d y=%d\n", x, y); /* 4 */ }

А теперь мы и переменную внутри main(), и аргумент функции func1() назвали одним и тем же именем. Что будет?

Будет то же самое, что в предыдущем примере.

В момент вызова функции func1() будет создана НОВАЯ переменная с именем x, а старая (прежняя) переменная и ее значение будут ВРЕМЕННО СПРЯТАНЫ (скрыты).

Можно было бы уточнить эти переменные именами функций, в которых они определены:




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