Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Философия программирования на C++ Выпуск 18. Локальность


Добрый день, уважаемые читатели!

Сегодня мы поговорим про область видимости переменных. Это по сути тема о том, когда одно и то же имя переменной можно использовать много раз (если совсем грубо говоря).

Сразу программка (да-да, опять программа ни о чем - что ж поделать, если нужно что-то понять, приходится писать такие вот ничего не делающие программы).

#include <iostream>
using namespace std;
int main() {
    int a = 0;  // Создаем переменную как обычно
    cout << "Please, enter a
number: ";
    cin >> a;
    cout << "You entered: " << a << endl;
    {
        cout << "a in sub block - before creation: " << a << endl;  // Здесь значение переменной - 12
        int a = 10;  // В номов блоке создаем еще одну переменную с тем же именем!
        cout << "a in sub block: " << a << endl;  // Выводим значение переменной a - здесь оно равно 10
        int b = 20;
        cout << "b in sub block: " << b << endl;
    }
    cout << "a in main block: " << a << endl;  // А здесь та же переменная равна введенному числу!
    //! cout << "b in main block: " << b << endl;  // ЗДЕСЬ ПЕРЕМЕННОЙ b НЕ СУЩЕСТВУЕТ!
}

Сначала все идет как обычно, мы просто вводим число в переменную а. Дальше открываем блок - и выводим ее содержимое. Ничего необычного. Но потом мы создаем переменную с тем же именем внутри этого блока. Так вот, у каждого блока могут быть свои "локальные" переменные с любыми именами (но нельзя создать две переменные с одинаковым именем в одном блоке). Но как видно из примера, внутренние блоки видят переменные внешнего блока (как мы вывели переменную а, после чего создали еще одну с тем же именем) - но не наоборот.

Вообще говоря все это естественно, внутренние видят что происходит снаружи, но могут заменить собственным. Но вот переменная а начинает существовать только с момента ее объявления (когда мы указали ее тип и имя) - поэтому до строчки int a = 10; используется "внешняя" переменная а.

Думаю, запустив эту программу, вы все поймете. Это не сложно.

Далее. Тело любого условия или цикла является отдельным внутренним блоком. Поэтому внутри условия или блока мы можем использовать внешние переменные - а вот снаружи использовать их локальные переменные нельзя. Более того. В цикле for переменная, объявляемая в блоке инициализации - тоже является локальной - и не видна вне цикла. Пример: сложим числа от 1 до 10.

#include <iostream>
using namespace std;
int main() {
    int sum = 0;
    for (int i = 1; i < 11; i++) {
        sum += i;
    }
    cout << "sum: " << sum << endl;
    //! cout << "i: " << i << endl;
}

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

Как видите, цикл тоже отделяется теми же фигурными скобками. И внутри мы используем внешнюю переменную sum.

Надеюсь, с этим проблема дальше не будет. Ждите следующий выпуск - мы расскажем вам, как понимать что сообщает вам компилятор!

До встречи! 

 


В избранное