Переменная я поведение в случае переключения

#include<stdio.h>
int main() 
{
    int i=9;
    switch(i)
    {
         static int i=1;
         i=3;
         i=i*i;

         case 3:
                 i=i+11;
         case 4:
                 i=i+22;
         case 5:
                 i=i+33;
         default:
                 i=i+44;
          printf("%d",i);
    }
    printf("%d",i);
}

Я не понимаю фактического поведения, результат 45 9.
Может ли кто-нибудь дать мне вескую причину.

  1. Как это устроено?
  2. почему это?

Заранее спасибо.

3 ответа

Нет заявлений до case: выполняется внутри переключателя, за исключением variable declaration

#include<stdio.h>
int main() 
{
    int i=9;
    switch(i)
    {
         static int i=1;
         printf("I AM HERE %d\n", i);
         i=3;
         i=i*i;

         case 3:
                 i=i+11;
         case 4:
                 i=i+22;
         case 5:
                 i=i+33;
         default:
                 i=i+44;
          printf("%d",i);
    }
    printf("%d",i);
}

Вывод не будет печатать строку I AM HERE,

Этот переключатель похож на запись как

    switch(i)
    {
         static int i=1;
         case 3:
                 i=i+11;
         case 4:
                 i=i+22;
         case 5:
                 i=i+33;
         default:
                 i=i+44;
          printf("%d",i);
    }

Поскольку значение i = 9, default чехол выполнен, который печатает i = 45,

Также область действия переменной i заявленный внутри выключатель ограничен только внутри switch {} блок. Поэтому, когда контроль выходит из этой области, значение i = 9 который объявлен в блоке main

У вас есть два iS... один виден только в блоке, который составляет switch() тело, а другой за его пределами. switch(i) включает внешнюю i (тот, который инициализирован в 9), так что идет к default: дело. Когда он запускает следующий код в default::

     default:
             i=i+44;
      printf("%d",i);

... он использует i объявлено внутри switch() блок (тот, который инициализирован в 1), поэтому печатает "45". Это не влияет на i вне коммутатора, хотя.

После switch() закрывающая скобка блока, вторая printf():

   }
   printf("%d",i);

использует i снаружи выключатель (тот, который инициализирован в 9), поэтому он печатает "9".

По сути, switch() body - это блок, а объявленная в блоке переменная является локальной для этого блока, но может скрыть другую переменную с таким же именем из внешней области видимости.

Оператор switch работает следующим образом:

  1. Оператор switch вычисляет выражение в скобках (в этом случае i со значением 9) и прыгает к соответствующему case (который в этом случае default, поскольку нет case 9 существует).
  2. Переменные перед первым case объявлены. В этом случае новая переменная с именем i объявляется со значением 1, Обратите внимание, что в то время как это разделяет имя с ранее объявленным i они являются отдельными переменными, и новая переменная переопределяет предыдущую до конца оператора switch. Так как мы прыгаем прямо к default label, ни один из кодов до запуска этой метки.
  3. Код выполняется до тех пор, пока он не встретит break или конец оператора switch. Тогда все переменные, объявленные внутри оператора switch, исчезают, а в нашем случае старые i переменная снова доступна.

На default ярлык, программа добавляет 44 к "новому" i переменная (которая ранее была 1) и добавляет к нему 44, давая ему новое значение 45. Затем оно печатает значение.

Однако после оператора switch новый i переменная была выгружена и старый i переменная снова становится доступной. Это все еще имеет старую ценность 9, так что это значение, которое печатается.

Другие вопросы по тегам