Historique de la question :
L'opérateur switch a été introduit dans le langage C pour faciliter la répartition du contrôle sur plusieurs branches en fonction de la valeur d'une expression. C'est une alternative à une grande chaîne if-else et est largement utilisé pour traiter des commandes, des états et des valeurs d'énumérations.
Problème :
Les principaux dangers de l'opérateur switch sont liés aux instructions break oubliées, à la chute inattendue dans un 'fallthrough', aux difficultés avec les variables déclarées à l'intérieur d'un bloc, ainsi qu'au fait que le type de l'expression doit être entier.
Solution :
Pour une utilisation sûre :
break (ou marquer explicitement la nécessité d'un fallthrough avec des commentaires) ;int ou compatibles ;case dans la branche default ;case, ou dans des blocs {}.Exemple de code :
#include <stdio.h> void print_day(int day) { switch (day) { case 1: printf("Lundi "); break; case 2: printf("Mardi "); break; case 3: printf("Mercredi "); break; case 4: printf("Jeudi "); break; case 5: printf("Vendredi "); break; case 6: case 7: printf("Week-end "); break; default: printf("Jour inconnu "); } }
Caractéristiques clés :
Peut-on utiliser le type float dans l'expression switch ?
Non. La norme du langage C exige que l'expression dans switch soit entière ou convertie en entier (char, short, int, long, enum, etc.).
Que se passera-t-il si on échange les cases ? L'ordre influence-t-il la logique ?
L'ordre des déclarations case dans switch n'influence pas la recherche de la valeur souhaitée. Le code s'exécute à partir du case correspondant jusqu'au premier break. Mais l'ordre affecte en l'absence de break (fallthrough).
Peut-on déclarer des variables à l'intérieur d'un case sans accolades ?
Non. Si vous déclarez une variable après un case sans bloc {} supplémentaire, cela entraînera une erreur de compilation. Correct :
switch (x) { case 1: { int y = 0; break; } }
Dans un grand projet, un programmeur a oublié le break après l'un des cas et a obtenu l'exécution erronée de plusieurs branches consécutives. Le bug a été remarqué uniquement par l'utilisateur.
Avantages :
Inconvénients :
Dans le cas où un fallthrough était nécessaire, des fallthrough commentés avec explications ont été utilisés, tous les cas critiques étaient accompagnés de break ou return, et un avertissement était affiché dans le default.
Avantages :
Inconvénients :