Как работает оператор switch? - PullRequest
16 голосов
/ 23 февраля 2012

Как обрабатываются операторы, предшествующие любому case помеченному оператору в блоке switch-case. Пожалуйста, объясните поведение следующих программ

prog1:

#include<stdio.h>
int main()
{
  switch(1)
  {   
    int i=0; 
    case 1:printf("%d",i);         
  }
getchar();
return 0;
}

Вывод: значение мусора.

PROG2:

#include<stdio.h>
int main()
{
  switch(1)
  {  
    printf("Inside Switch");  
    case 1:printf("Case 1\n");      
  }
  printf("Outside Switch");
  getchar();
  return 0;
}

Выход:

Дело 1

Внешний выключатель.

Операторы перед оператором, помеченным регистром, кажутся недостижимыми в соответствии с программой 2, но почему бы не получить ошибку для необъявленной переменной i в первой программе (только предупреждение).

Было бы очень полезно, если бы кто-то мог подробно объяснить, как оператор switch обрабатывается внутри.

Ответы [ 3 ]

7 голосов
/ 23 февраля 2012

Это лучше всего объясняется цитатами из стандарта 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.

5 голосов
/ 23 февраля 2012

По сути, переключатель действует как переход к соответствующей метке - промежуточные операторы не выполняются.Определения переменных (которые на самом деле происходят во время компиляции) действительно имеют место, но если они содержат инициализацию, это тоже пропускается.

2 голосов
/ 23 февраля 2012

Никогда не пишите операторы в switch, которые не являются частью какого-либо случая или значения по умолчанию, потому что они не будут выполнены.

ПРИМЕЧАНИЕ: объявление может быть написано там, но не оператор (int i; является объявлением, но int i = 10; является объявлением + присваивание = оператор, поэтому там не будет выполняться присваивание ..!)

switch(a)
{
printf("This will never print"); // this will never executed
case 1:
        printf(" 1");
break;

default :
break;
}

см. это Почему переменные не могут быть объявлены в переключателезаявление сразу после ярлыков?

...