Namespaces
Variants

switch statement

From cppreference.net

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 :

switch(1) {
    case 1 : puts("1"); // affiche "1",
    case 2 : puts("2"); // puis affiche "2" ("fall-through")
}
switch(1) {
    case 1 : puts("1"); // affiche "1"
             break;     // et quitte le switch
    case 2 : puts("2");
             break;
}

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 case: ou default: dans sa portée, l'intégralité de l'instruction switch doit être dans sa portée (en d'autres termes, un VLA doit être déclaré soit avant l'ensemble du switch, soit après la dernière é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

switch , case , default

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