switch statement
Exécute du code en fonction de la valeur d'un argument intégral.
Utilisé lorsqu'une ou plusieurs branches de code parmi plusieurs doivent être exécutées selon une valeur entière.
Table des matières |
Syntaxe
attr-spec-seq
(optionnel)
switch (
expression
)
statement
|
|||||||||
| attr-spec-seq | - |
(C23)
liste facultative d'
attributs
, appliquée à l'instruction
switch
|
| expression | - | toute expression de type entier (char, entier signé ou non signé, ou énumération) |
| statement | - |
toute
instruction
(généralement une instruction composée).
case:
et
default:
sont autorisés dans
statement
, et l'instruction
break
;
a une signification particulière.
|
case
constant-expression
:
statement
|
(1) | (jusqu'en C23) | |||||||
attr-spec-seq
(optionnel)
case
constant-expression
:
statement
(optionnel)
|
(1) | (depuis C23) | |||||||
default
:
statement
|
(2) | (jusqu'en C23) | |||||||
attr-spec-seq
(optionnel)
default
:
statement
(optionnel)
|
(2) | (depuis C23) | |||||||
| constant-expression | - | toute expression constante entière |
| attr-spec-seq | - | (C23) liste optionnelle d' attributs , appliquée à l'étiquette |
Explication
Le corps d'une instruction switch peut comporter un nombre arbitraire d'étiquettes
case:
, tant que les valeurs de toutes les
constant-expressions
sont uniques (après
conversion
vers le
type promu
de l'
expression
). Au plus une étiquette
default:
peut être présente (bien que des instructions switch imbriquées puissent utiliser leurs propres étiquettes
default:
ou avoir des étiquettes
case:
dont les constantes sont identiques à celles utilisées dans le switch englobant).
Si expression s'évalue à une valeur égale à la valeur de l'une des constant-expression s après conversion vers le type promu de expression , alors le contrôle est transféré à l'instruction étiquetée avec cette constant-expression .
Si
l'expression
évalue à une valeur qui ne correspond à aucune des étiquettes
case:
, et que l'étiquette
default:
est présente, le contrôle est transféré à l'instruction étiquetée avec
default:
.
Si
expression
s'évalue à une valeur qui ne correspond à aucune des étiquettes
case:
, et que l'étiquette
default:
n'est pas présente, aucune partie du corps du switch n'est exécutée.
L'instruction break , lorsqu'elle est rencontrée n'importe où dans statement , quitte l'instruction switch :
|
Comme toutes les autres instructions de sélection et d'itération, l'instruction switch établit une portée de bloc : tout identifiant introduit dans l' expression sort de la portée après l' instruction .
Si un VLA ou un autre identifiant avec un type à modification variable a une étiquette
switch (expr) { int i = 4; // not a VLA; OK to declare here f(i); // never called // int a[i]; // error: VLA cannot be declared here case 0: i = 17; default: int a[i]; // OK to declare VLA here printf("%d\n", i); // prints 17 if expr == 0, prints indeterminate value otherwise } |
(depuis C99) |
Mots-clés
Exemple
#include <stdio.h> void func(int x) { printf("func(%d): ", x); switch(x) { case 1: printf("case 1, "); case 2: printf("case 2, "); case 3: printf("case 3.\n"); break; case 4: printf("case 4, "); case 5: case 6: printf("case 5 or case 6, "); default: printf("default.\n"); } } int main(void) { for(int i = 1; i < 9; ++i) func(i); }
Sortie :
func(1): case 1, case 2, case 3. func(2): case 2, case 3. func(3): case 3. func(4): case 4, case 5 or case 6, default. func(5): case 5 or case 6, default. func(6): case 5 or case 6, default. func(7): default. func(8): default.
Références
- Norme C17 (ISO/CEI 9899:2018) :
-
- 6.8.4.2 L'instruction switch (p: 108-109)
- Norme C11 (ISO/CEI 9899:2011) :
-
- 6.8.4.2 L'instruction switch (p: 149-150)
- Norme C99 (ISO/CEI 9899:1999) :
-
- 6.8.4.2 L'instruction switch (p: 134-135)
- Norme C89/C90 (ISO/IEC 9899:1990) :
-
- 3.6.4.2 L'instruction switch
Voir aussi
|
Documentation C++
pour
switch
statement
|