Инициализируются ли локальные переменные в составном операторе switch, когда метка `default:` помещается вне фигурных скобок?

Обычно при использовании оператора 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)? Судя по тому, что я знаю о стандартах, да, это должно быть, но я не могу найти это прямо ни в одном из имеющихся у меня документов. Может ли кто-нибудь дать окончательный ответ?

И прежде чем я получу комментарии по этому поводу, да, я знаю, что это не способ программирования в реальном мире. Но, как всегда, меня интересуют границы спецификации языка. Я бы никогда не потерпел такого стиля в моей команде программистов!

6
задан Community 23 May 2017 в 12:12
поделиться