Ответ 1
Это лучше всего объясняется цитатами из стандарта c. Я цитирую соответствующие части из стандарта, которые применимы к вашему вопросу здесь.
6.8.4.2 Оператор switch
Параграф 4:
ОператорA
switch
приводит к тому, что элемент управления выполняет переход, в или мимо оператора, который являетсяswitch
тело, в зависимости от значения управляющего выражения, и от наличияdefault
и значения любых метокcase
на или в корпусе переключателя......
Параграф 2:
Если оператор
switch
имеет связанную меткуcase
илиdefault
в пределах области идентификатор с измененным типом, весь оператор switch должен находиться в пределах область действия этого идентификатора. 154)
FootNote:
154) То есть объявление либо предшествует оператору switch, либо оно следует за последней меткой
case
илиdefault
, связанной сswitch
, которая находится в блоке, содержащем объявление.
Параграф 7:
ПРИМЕР В фрагменте искусственной программы
switch (expr)
{
int i = 4;
f(i);
case 0:
i = 17;
/* falls through into default code */
default:
printf("%d\n", i);
}
объект с идентификатором
i
существует с автоматической продолжительностью хранения (внутри блока), но никогда не инициализируется, и, следовательно, если управляющее выражение имеет ненулевое значение, вызов функцииprintf
будет иметь доступ неопределенное значение. Аналогично, вызов функцииf
не может быть достигнут.
Вышеупомянутое относится к обоим примерам кода в Вопросе. Example 1
, i
имеет значение Неопределенное, поскольку оно никогда не инициализировалось и, следовательно, печатает мусор,
Example 2
, printf
вызов не достигается, потому что элемент управления переходит к соответствующей метке case
.