Переменная я поведение в случае переключения
#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.
Может ли кто-нибудь дать мне вескую причину.
- Как это устроено?
- почему это?
Заранее спасибо.
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
У вас есть два i
S... один виден только в блоке, который составляет 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 работает следующим образом:
- Оператор switch вычисляет выражение в скобках (в этом случае
i
со значением9
) и прыгает к соответствующемуcase
(который в этом случаеdefault
, поскольку нетcase 9
существует). - Переменные перед первым
case
объявлены. В этом случае новая переменная с именемi
объявляется со значением1
, Обратите внимание, что в то время как это разделяет имя с ранее объявленнымi
они являются отдельными переменными, и новая переменная переопределяет предыдущую до конца оператора switch. Так как мы прыгаем прямо кdefault
label, ни один из кодов до запуска этой метки. - Код выполняется до тех пор, пока он не встретит
break
или конец оператора switch. Тогда все переменные, объявленные внутри оператора switch, исчезают, а в нашем случае старыеi
переменная снова доступна.
На default
ярлык, программа добавляет 44 к "новому" i
переменная (которая ранее была 1
) и добавляет к нему 44, давая ему новое значение 45. Затем оно печатает значение.
Однако после оператора switch новый i
переменная была выгружена и старый i
переменная снова становится доступной. Это все еще имеет старую ценность 9
, так что это значение, которое печатается.