Сокрытие имен
Локальные переменные могут быть объявлены в любом блоке
Чаще всего все переменные, которые будут нужны в некоторой функции, объявляются в начале ее функционального блока. Так поступают главным образом для того, чтобы тот, кто будет читать этот код, мог легко определить, какие переменные будут в нем использоваться. Однако начало функционального блока не является единственным местом, где можно объявлять локальные переменные. Локальную переменную можно объявить где угодно, в любом блоке кода. Переменная, объявленная внутри блока, локальна по отношению к этому блоку. Это означает, что переменная не существует, пока не начал выполняться этот блок, и уничтожается вместе с завершением блока.
Никакие предложения вне этого блока — включая остальные строки той же функции - не могут обратиться к этой переменной. Для того, чтобы усвоить это ограничение, рассмотрим следующую программу:
// Переменные могут быть локальными по отношению к блоку.
#include <iostream>
using namespace std;
int main () {
int x = 19; // x известна всюду,
if(x == 19) {
int y = 20 ; // у локальна по отношению к блоку if.
cout << "х + у равно " << x + y << "\n";
}
// у = 100; // Ошибка! у здесь неизвестна,
return 0;
}
Переменная х объявлена в начале области видимости main() и доступна всему последующему коду, входящему в main(). Внутри блока if объявляется переменная у. Поскольку блок определяет область видимости, у видима только для остального кода внутри своего блока. Поэтому вне этого блока предложение
у = 100;
закомментировано. Если вы удалите ведущие символы комментария, при компиляции будет зафиксирована ошибка, поскольку у не видна вне ее блока. Внутри блока if можно использовать х, потому что код внутри блока имеет доступ к переменным, объявленным во внешнем блоке, содержащем в себе данный.
Хотя локальные переменные обычно объявляются в начале их блока, это не обязательно. Локальная переменная может быть объявлена в любом месте внутри блока, но, разумеется, перед тем, как она будет использоваться. Например, следующая программа вполне правильна:
#include <iostream>
using namespace std;
int main() {
cout << "Введите число: ";
int a; // объявим одну переменную
cin >> a;
cout << "Введите второе число:";
int b; // объявим другую переменную
cin >> b;
cout << "Произведение: " << a*b << '\n';
return 0;
}
В этом примере а и b не объявляются до тех пор, пока в них не возникает необходимость. Честно говоря, большинство программистов объявляют локальные переменные в начале использующей их функции, но это вопрос вкуса.
Если локальная переменная, объявленная во внутреннем блоке, имеет то же имя, что и переменная, объявленная во внешнем блоке, то переменная, объявленная во внутреннем блоке, скрывает переменную из внешнего блока. Например:
#include <iostream>
using namespace std;
int main()
{
int i ;
int j ;
i = 10;
j = 100;
if (j > 0) {
int i; // эта i отличается от внешней i
i = j / 2;
cout << "внутренняя i: " << i << '\n';
}
cout << "внешняя i: " << i << '\n';
return 0;
}
Вывод этой программы:
внутренняя i : 5 0
внешняя i : 10
Переменная i, объявленная внутри блока if, скрывает внешнюю переменную i. Изменение значения внутренней i не оказывает влияния на внешнюю i. Более того, вне блока if внутренняя i неизвестна, и снова становится видимой внешняя i.