но это уже конструкции из
main::x
и
func1::x
( но это уже конструкции из языка Си++, а не Си).
Выполним программу по операторам:
|/* 1 */ Отводятся переменные main::x и main::y для целых чисел; |/* 2 */ main::x = 111; |/* 3 */ Вызывается func1(111); | +-------+ . |/* f.1 */ Отводится переменная func1::x со значением 111; . |/* f.2 */ Печатается 111 из переменной func1::x; . | . |/* f.3 */ func1::x = 77; (это не main::x, а другая переменная, . | ЛОКАЛЬНАЯ для функции func1. . | Переменную main::x мы сейчас не видим - . | она "заслонена" именем нашей локальной . | переменной. . | Поэтому мы не можем ее изменить). . | . |/* f.4 */ Печатает 77 из func1::x; . |/* f.5 */ Возвращает значение func1::x , то есть 77. . | Переменная func1::x уничтожается. . | . | Теперь мы снова возвращаемся в функцию main(), . | где имя x обозначает переменную main::x . | а не func1::x +-------+ | |/* 3 */ y = 77; |/* 4 */ Печатает значения main::x и main::y, то есть | 111 и 77.
Этот механизм сокрытия имен позволяет писать функции main() и func1() разным программистам, позволяя им НЕ ЗАБОТИТЬСЯ о том, чтобы имена локальных переменных в функциях НЕ СОВПАДАЛИ. Пусть совпадают - хуже не будет, механизм упрятывания имен разрешит конфликт. Зато программист может использовать любое понравившееся ему имя в любой функции - хотя бы и x, или i.
То же самое происходит с локальными переменными, а не с аргументами функции.
int func1(int arg){ /* локальная переменная-параметр func1::arg */ int x; /* локальная переменная func1::x */
x = arg; printf("func1: x=%d\n", x); x = 77; printf("func1: x=%d\n", x); return x; }
void main(){ int x, y; /* переменные main::x и main::y */
x = 111; y = func1(x);
printf("main: x=%d y=%d\n", x, y); }
Действует тот же самый механизм временного сокрытия имени x. Вообще же, аргументы функции и ее локальные переменные отличаются только одним: аргументам автоматически присваиваются начальные значения, равные значениям соответствующих выражений в списке
Содержание Назад Вперед