Обычно при использовании оператора switch
вы не можете определить и локальные переменные инициализации для составного оператора, как
switch (a)
{
int b = 5; /* Initialization is skipped, no matter what a is */
case 1:
/* Do something */
break;
default:
/* Do something */
break;
}
Однако, поскольку оператор switch
является оператором наподобие для
или в то время как
, нет правила, запрещающего не использовать составной оператор, поищите здесь примеры . Но это будет означать, что метка может использоваться между закрывающей скобкой после ключевого слова переключателя
и открывающей скобкой.
Так что, на мой взгляд, было бы возможно и разрешено использовать оператор switch
следующим образом:
switch (a)
default:
{
int b = 5; /* Is the initialization skipped when a != 1? */
/* Do something for the default case using 'b' */
break;
case 1: // if a == 1, then the initialization of b is skipped.
/* Do something */
break;
}
Мой вопрос: обязательно ли инициализация выполняется в этом случае (a! = 1)? Судя по тому, что я знаю о стандартах, да, это должно быть, но я не могу найти это прямо ни в одном из имеющихся у меня документов. Может ли кто-нибудь дать окончательный ответ?
И прежде чем я получу комментарии по этому поводу, да, я знаю, что это не способ программирования в реальном мире. Но, как всегда, меня интересуют границы спецификации языка. Я бы никогда не потерпел такого стиля в моей команде программистов!