int main()
{
int choice;
cout << "(1) сложить числа или ";
cout << "(2) конкатенировать строки?: ";
cin >> choice;
if(choice == 1) {
int a, b; /* Активизируются две int-переменные. */
cout << "Введите два числа: ";
cin >> а >> b;
cout << "Сумма равна " << a+b << '\n';
}
else {
char s1 [80], s2 [80]; /* Активизируются две строки. */
cout << "Введите две строки: ";
cin >> s1;
cin >> s2;
strcat (s1, s2);
cout << "Конкатенация равна " << s1 << '\n';
}
a = 10; // *** Ошибка ***
// Переменная а здесь неизвестна!
return 0;
}
Поскольку в данном случае переменная а неизвестна вне своего if-блока, компилятор выдаст ошибку при попытке ее использовать.
Если имя переменной, объявленной во внутреннем блоке, совпадает с именем переменной, объявленной во внешнем блоке, то "внутренняя" переменная переопределяет "внешнюю" в пределах области видимости внутреннего блока. Рассмотрим пример.
#include <iostream>
using namespace std;
int main()
{
int i, 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: 50
Внешняя переменная i: 10
Здесь переменная i, объявленная внутри if-блока, переопределяет, или скрывает, внешнюю переменную i. Изменения, которым подверглась внутренняя переменная i, не оказывают никакого влияния на внешнюю i. Более того, вне if-блока внутренняя переменная i больше не существует, и поэтому внешняя переменная i снова становится видимой.
Поскольку локальные переменные создаются с каждым входом и разрушаются с каждым выходом из программного блока, в котором они объявлены, они не хранят своих значений между активизациями блоков. Это особенно важно помнить в отношении функций. При вызове функции ее локальные переменные создаются, а при выходе из нее — разрушаются. Это означает, что локальные переменные не сохраняют своих значений между вызовами функций. (Существует один способ обойти это ограничение — он будет рассмотрен ниже в этой книге.)
Локальные переменные не хранят своих значений между активизациями.
Локальные переменные хранятся в стеке, если не задан иной способ хранения. Поскольку стек — это динамически изменяемая область памяти, локальные переменные не могут в общем случае сохранять свои значения между вызовами функций.
Как упоминалось выше, несмотря на то, что локальные переменные обычно объявляются в начале своего блока, это не является обязательным. Локальные переменные можно объявить в любом месте блока, главное, чтобы это было сделано до их использования. Например, следующая программа вполне допустима.
#include <iostream>
using namespace std;
int main()
{
cout << "Введите число: ";
int a; // Объявляем одну переменную.
cin >> a;
cout << "Введите второе число: ";
int b; // Объявляем еще одну переменную.
cin >> b;
cout << "Произведение равно: " << а*Ь << '\n';
return 0;
}
В этом примере переменные а и b не объявляются до тех пор, пока они станут нужными. Все же большинство программистов объявляют все локальные переменные в начале блока, в котором они используются, но это, как говорится, вопрос стилистики (или вкуса).