Intereting Posts

Как работает оператор switch?

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

prog1:

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

Выход: стоимость мусора.

PROG2:

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

Выход:

Случай 1

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

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

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

Это лучше всего объясняется цитатами из стандарта c. Я цитирую соответствующие части из стандарта, которые применимы к вашему вопросу здесь.

6.8.4.2 Оператор переключения

Параграф 4:

Оператор switch приводит к тому, что элемент управления переходит к, в или мимо оператора, который является телом switch , в зависимости от значения управляющего выражения и наличия метки по default и значений любых меток ярлыков на коммутаторе или в коммутаторе корпус ……

Параграф 2:

Если оператор switch имеет связанный case или метку по default пределах области идентификатора с измененным типом, весь оператор switch должен находиться в пределах этого идентификатора. 154)

Сноска:

154) То есть объявление либо предшествует команде switch, либо оно следует за последним case или меткой по default связанной с switch который находится в блоке, содержащем объявление.

Параграф 7:
ПРИМЕР В fragmentе искусственной программы

 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 .

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

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

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

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

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