Почему мы можем пропустить определение переменной, перейдя сразу к присвоению этой переменной?

Рейтинг: 2Ответов: 2Опубликовано: 13.01.2023
switch (2) 
{
   case 1:
      int x;
   case 2:
      x = 23;
}

std::cout << x;

Давно уже не могу понять почему мы можем пропустить определение переменной, перейдя сразу к присвоению этой переменной? Почему (в этом контексте) пишут что это объявление, если это определение(ну и объявление, а вот наоборот - нет)? Если это действительно было объявление, то тогда вышеизложенный код мне понятен.

Почему я не могу вывести значение x, ведь они находятся в одной области видимости.

Ответы

▲ 5

Потому что как таковой инициализации int нет. Если вы вместо него используете какой-то объект посерьезнее, например, string

switch (2)
{
case 1:
    int x;
    string a;
case 2:
    a = "2";
    x = 23;
}

то получите ошибку "пропуск инициализации a из-за метки case"... Кстати, стоит добавить инициализацию этого x, как компилятор вас остановит:

switch (2)
{
case 1:
    int x = 5;
case 2:
    x = 23;
}

Все, этот код неверен из-за пропущенной инициализации.

Областью видимости x являются строки от его объявления до закрывающей фигурной скобки, поэтому вывести ее значение вне конструкции switch вы не можете.

▲ 4

Нужно отделять время компиляции и время выполнения программы.
На этапе компиляции будет определена переменная int x; с областью видимости и временем жизни внутри оператора switch(). Т.е. вы не пропускаете объявление переменной, поместив его в case 1:. Возможно для понимания так будет проще:

switch (2)
{
    int x;

    case 1:
    case 2:
        x = 23;
}

А вот в выражении std::cout << x; переменная x неизвестна, т.к. у ранее объявленной область видимости - блок оператора switch().