Смотря что имеется ввиду под словом «выполняется»
Код
#include <stdint.h>
uint8_t foo(uint8_t u)
{
switch (u) {
static uint8_t s = 20;
case 0:
return u+s;
case 1:
++s;
case 2:
return u-s;
default:
break;
}
// s = 0; // Низзя! Тут s не видно, она внутри блока swicth
return 0;
}
Код
foo:
/* prologue: function */
/* frame size = 0 */
cpi r24,lo8(1)
breq .L4
cpi r24,lo8(1)
brlo .L3
cpi r24,lo8(2)
breq .L11
ldi r24,lo8(0)
ret
.L3:
lds r24,s.1215
ret
.L4:
lds r25,s.1215
subi r25,lo8(-(1))
sts s.1215,r25
sub r24,r25
ret
.L11:
lds r25,s.1215
sub r24,r25
ret
.data
s.1215:
.byte 20
Где-то уже писал — не могу найти...
switch — это такой оптимизированный условный goto в кучу меток. Все метки должны быть внутри одного выражения (statement)
Цитата(C99)
6.8.4 Selection statements
Syntax
1
selection-statement:
if ( expression ) statement
if ( expression ) statement else statement
switch ( expression ) statement
Как видим, особой разницы между
if ( expression ) statement и
swicth ( expression ) statement не наблюдается. Кто такой statement — смотрим отдельно
Цитата
6.8 Statements and blocks
statement:
labeled-statement /* сюда входит метка case */
compound-statement
...
Цитата
6.8.2 Compound statement
compound-statement:
{ block-item-listopt }
block-item-list:
block-item
block-item-list block-item
block-item:
declaration /* в любом compound statement, включая switch-евый, может быть declaration */
statement
Если выражение простое (не составное), то и switch может выглядеть вообще так:
Код
uint8_t moo(uint8_t u)
{
// if ( u == 0 || u == 3 || u == 5 ) return 0;
switch(u)
case 0:
case 3:
case 5:
return 0;
return 1;
}
Код
moo:
cpi r24,lo8(3)
breq .L14
cpi r24,lo8(5)
breq .L14
tst r24
brne .L17
.L14:
ldi r24,lo8(0)
ret
.L17:
ldi r24,lo8(1)
ret
Тут несколько разных путей поставить нельзя, так как ';' ограничивает выражение и следующий case окажется за пределами switch.
Поэтому swicth «чуть реже, чем всегда» применяется с составными (compound statement), заключающими отдельные statement в фигурные скобки.
А в начале такого блока может и до метки что-то стоять. Главное, чтобы смысл в этом был. Как в примере выше — статическая переменная.