Le standard C99 n'est pas explicite à ce sujet, mais en prenant tous les faits ensemble, il est tout à fait valide.
Un case
et default
label sont l'équivalent d'un goto
label. Voir 6.8.1 Marqué consolidés. Particulièrement intéressante est 6.8.1.4, qui permet déjà mentionné Duff de l'Appareil:
Tout énoncé peut être précédé par un
préfixe qui déclare un identificateur
un nom d'étiquette. Les étiquettes elles-mêmes ne
ne pas altérer le flux de contrôle, qui
se poursuit sans obstacle à travers eux.
Edit: Le code à l'intérieur d'un commutateur n'est rien de spécial, c'est un bloc de code comme dans un if
-déclaration, avec saut supplémentaire étiquettes. C'est ce qui explique la chute-à travers le comportement et pourquoi break
est nécessaire.
6.8.4.2.7 donne même un exemple:
switch (expr)
{
int i = 4;
f(i);
case 0:
i=17;
/*falls through into default code */
default:
printf("%d\n", i);
}
Dans l'artificiel, fragment d'un programme de l'
objet dont l'identifiant est que j'existe
automatique de la durée de stockage
(dans le bloc), mais n'est jamais
initialisé, et donc si l'
le contrôle de l'expression a une valeur non nulle en
valeur, l'appel à la fonction printf
accéderez à une valeur indéterminée.
De même, l'appel à la fonction f
ne peut pas être atteint.
Le cas des constantes doivent être uniques au sein d'une instruction switch:
6.8.4.2.3 L'expression de chaque cas, l'étiquette doit être une constante entière
l'expression et le pas de deux de l'affaire
des expressions constantes dans le même
instruction switch doit avoir le même
valeur après la conversion. Il peut être
au plus une étiquette par défaut dans un switch
l'énoncé.
Tous les cas sont évalués, puis il saute à l'étiquette par défaut, si:
6.8.4.2.5 L'entier des promotions sont effectuées sur le contrôle de
de l'expression. L'expression constante dans
chaque cas l'étiquette est converti à l'
promu type de contrôle
de l'expression. Si une valeur convertie
les matches de la promotion
le contrôle de l'expression, le contrôle des sauts
pour la déclaration à la suite de la correspondance
cas d'étiquette. Sinon, si il y a un
étiquette par défaut, le contrôle passe à la
étiquetés la déclaration. Si non converti
cas l'expression constante et correspond à
il n'y a pas d'étiquette par défaut, aucune partie de
le corps de l'interrupteur est exécutée.