Поскольку в данном случае переменная а неизвестна вне своего if-блока, компилятор выдаст ошибку при попытке ее использовать.

Если имя переменной, объявленной во внутреннем блоке, совпадает с именем переменной, объявленной во внешнем блоке, то "внутренняя" переменная переопределяет "внешнюю" в пределах области видимости внутреннего блока. Рассмотрим пример.

#include

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

using namespace std;

int main()

{

 cout << "Введите число: ";

 int a; // Объявляем одну переменную.

 cin >> a;

 cout << "Введите второе число: ";

 int b; // Объявляем еще одну переменную.

 cin >> b;

 cout << "Произведение равно: " << а*Ь << '\n';

 return 0;

}

В этом примере переменные а и b не объявляются до тех пор, пока они станут нужными. Все же большинство программистов объявляют все локальные переменные в начале блока, в котором они используются, но это, как говорится, вопрос стилистики (или вкуса).

Объявление переменных в итерационных инструкциях и инструкциях выбора

Переменную можно объявить в разделе инициализации цикла for или условном выражении инструкций if, switch или while. Переменная, объявленная в одной из этих инструкций, имеет область видимости, которая ограничена блоком кода, управляемым этой инструкцией. Например, переменная, объявленная в инструкции цикла for, будет локальной для этого цикла, как показано в следующем примере.

#include

using namespace std;

int main()

{

 // Переменная i локальная для цикла for.

 for(int i=0; i<10; i++) {

  cout << i << " ";

  cout << "в квадрате равно " << i * i << "\n";

 }

 // i = 10; // *** Ошибка *** -- i здесь неизвестна!

 return 0;

}

Здесь переменная i объявляется в разделе инициализации цикла for и используется для управления этим циклом. А за пределами цикла переменная i неизвестна.

В общем случае, если управляющая переменная цикла for не нужна за пределами этого цикла, то объявление ее внутри for-инструкции (как показано в этом примере) хорошо тем, что оно ограничивает ее существование рамками цикла и тем самым предотвращает случайное использование в каком-то другом месте программы. Профессиональные программисты часто объявляют управляющую переменную цикла внутри for-инструкции. Но если переменная требуется коду вне цикла, ее нельзя объявлять в инструкции for.

Перейти на страницу:

Все книги серии Изучайте C++ с профессионалами

Похожие книги