Думайте о switch
как о goto
с ярлыками.Неважно, где вы goto
, поскольку объявление переменной находится выше того места, где вы его используете, вы можете его использовать.Это частично связано с тем фактом, что объявление переменной не является исполняемым оператором, который выполняется как выражение.Этот переключатель почти эквивалентен:
int a = 1;
{
if (a == 1) goto case1;
goto defaultcase;
int b;
case1:
b = 34;
printf("%d", b);
goto end;
defaultcase:
goto end;
end:
}
return 0;
И goto
не имеют ничего общего с областью действия b
.
Попробуйте сделать это, хотя:
switch (a)
{
int b = 1;
....
В этом случае, даже если объявлено b
, инициализация будет пропущена, поскольку является исполняемым оператором, который может быть выполнен или не выполнен.Ваш компилятор должен предупредить вас, если вы попытаетесь это сделать.
Относительно объявления внутри if
(обновленный вопрос): В этом случае a
имеет область действия, ограниченную if
.Он создается при вводе области и уничтожается при завершении области.