Выбрать главу

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 не объявляются до тех пор, пока они станут нужными. Все же большинство программистов объявляют все локальные переменные в начале блока, в котором они используются, но это, как говорится, вопрос стилистики (или вкуса).