В данном случае напечатается 77,
В данном случае напечатается 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); }
Просто вызов и все.
Содержание Назад Вперед