Это лучше всего объясняется цитатами из стандарта c.Я цитирую соответствующие части из стандарта, которые относятся к вашему вопросу здесь.
6.8.4.2 Оператор switch
Para 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
имеет Indeterminate значение, так как оно никогда не инициализировалось и, следовательно, печатает мусор, в то время как в
Example 2
, printf
вызов не достигается, потому что элемент управления переходит на соответствующую метку case
.