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


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


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. Вообще же, аргументы функции и ее локальные переменные отличаются только одним: аргументам автоматически присваиваются начальные значения, равные значениям соответствующих выражений в списке




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