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


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


В данном случае напечатается 77, но ни ::x ни main::x не будут изменены оператором x = 77. Это изменялась f1::x

/* 5 */ При вызове f2() история интереснее. Тут нет своей собственной переменной x. Но какая переменная печатается тут - ::x или main::x ?

Ответ: ::x то есть 12.

Переменные названы локальными еще и потому, что они НЕВИДИМЫ В ВЫЗЫВАЕМЫХ ФУНКЦИЯХ.

Это ОПРЕДЕЛЕНИЕ локальных переменных. (Поэтому не спрашивайте "почему?" По определению)

То есть, если мы имеем

funca(){ int vara; ... ...funcb();... /* вызов */ ... }

то из функции funcb() мы НЕ ИМЕЕМ ДОСТУПА К ПЕРЕМЕННОЙ vara.

funcb(){ int z;

z = vara + 1; /* ошибка, vara неизвестна внутри funcb() */ }

Если, в свою очередь, funcb() вызывает funcc(), то и из funcc() переменная vara невидима.

Остановитесь и осознайте. Это правило служит все той же цели - разные функции могут быть написаны разными программистами, которые могут использовать одни и те же имена для РАЗНЫХ переменных, не боясь их взаимопересечения. Множества имен, использованных в разных функциях, независимы друг от друга. Имена из одной функции НИКАК не относятся к переменным с теми же именами ИЗ ДРУГОЙ функции.

Вернемся к параграфу КАК ПРОИСХОДИТ ВЫЗОВ ФУНКЦИИ и рассмотрим пункт (a). Теперь он может быть описан как

(a) Локальные переменные и аргументы вызывающей функции делаются невидимыми. ~~~~~~~~~~ А при возврате из функции:

(5) Локальные переменные и аргументы вызывающей функции снова делаются видимыми.

ОДНАКО глобальные переменные видимы из ЛЮБОЙ функции, исключая случай, когда глобальная переменная заслонена одноименной локальной переменной данной функции.

ПРОЦЕДУРЫ ========= Бывают функции, которые не возвращают никакого значения. Такие функции обозначаются void ("пустышка"). Такие функции называют еще ПРОЦЕДУРАМИ.

void func(){ printf("Приветик!\n"); return; /* вернуться в вызывающую функцию */ }

Такие функции вызываются ради "побочных эффектов", например печати строчки на экран или изменения глобальных (и только) переменных.

int glob;

void func(int a){ glob += a; }

Оператор return тут необязателен, он автоматически выполняется перед последней скобкой }

Вызов таких функций не может быть использован в операторе присваивания:

main(){ int z;

z = func(7); /* ошибка, а что мы присваиваем ??? */ }

Корректный вызов таков:

main(){ func(7); }

Просто вызов и все.




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