КАК ПРОИСХОДИТ ВЫЗОВ ФУНКЦИИ - часть 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, а старая (прежняя) переменная и ее значение будут ВРЕМЕННО СПРЯТАНЫ (скрыты).
Можно было бы уточнить эти переменные именами функций, в которых они определены: