Почему мы можем пропустить определение переменной, перейдя сразу к присвоению этой переменной?
switch (2)
{
case 1:
int x;
case 2:
x = 23;
}
std::cout << x;
Давно уже не могу понять почему мы можем пропустить определение переменной, перейдя сразу к присвоению этой переменной? Почему (в этом контексте) пишут что это объявление, если это определение(ну и объявление, а вот наоборот - нет)? Если это действительно было объявление, то тогда вышеизложенный код мне понятен.
Почему я не могу вывести значение x, ведь они находятся в одной области видимости.
Ответы (2 шт):
Нужно отделять время компиляции и время выполнения программы.
На этапе компиляции будет определена переменная int x; с областью видимости и временем жизни внутри оператора switch().
Т.е. вы не пропускаете объявление переменной, поместив его в case 1:.
Возможно для понимания так будет проще:
switch (2)
{
int x;
case 1:
case 2:
x = 23;
}
А вот в выражении std::cout << x; переменная x неизвестна, т.к. у ранее объявленной область видимости - блок оператора switch().
Потому что как таковой инициализации 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 вы не можете.