switch, break et continue
Approfondir : switch, break et continue
if exprime des conditions générales. switch exprime un choix selon une valeur entière précise, par exemple un numéro de menu. break et continue modifient ensuite le déroulement d’un switch ou d’une boucle ; ils ne sont pas interchangeables.
Une correspondance entre valeurs et actions
L’expression d’un switch doit avoir un type entier. Un char convient également, par exemple pour les opérateurs '+', '-', '*' et '/'. Les étiquettes case sont des expressions constantes entières distinctes ; une variable lue au clavier ne peut pas servir d’étiquette. On ne peut pas comparer directement une chaîne à plusieurs textes avec switch.
Le rôle de break
Après avoir trouvé un case, l’exécution continue dans les instructions suivantes jusqu’à un break, un return ou la fin du switch. Un break explicite évite donc de poursuivre dans le case suivant. Ce passage d’un cas au suivant peut être intentionnel, mais il doit être clairement documenté. Pour des débutants, un case terminé par break rend chaque choix indépendant.
default et validation
default s’exécute si aucun case ne correspond. Il permet d’annoncer un choix inconnu. Il n’est pas obligatoire, mais ignorer un choix inattendu produit souvent une interface déroutante. Un switch ne vérifie pas que scanf a réussi : la lecture doit être contrôlée séparément avant d’utiliser la valeur.
continue appartient à une boucle
Dans une boucle, continue passe à l’itération suivante. Dans un for, l’expression de progression est exécutée avant le nouveau test ; dans un while, on revient directement au test. Si la progression du while était écrite après le continue, elle sera sautée : c’est une cause fréquente de boucle infinie. Dans un switch placé dans une boucle, continue vise la boucle, tandis que break quitte seulement le switch.
Quand préférer if
Les intervalles comme note<10, les conditions composées et les comparaisons de réels relèvent naturellement de if/else. Un switch n’est pas une écriture pour une plage 10 à 12. Utiliser une cascade de cases pour chaque entier serait peu lisible et ne couvrirait pas les décimaux. La structure de contrôle doit refléter le domaine des données.
Choix : menu avec switch
#include <stdio.h>
int main(void) {
int choix;
puts("Choisir 1 (bonjour) ou 2 (aide) :");
if (scanf("%d", &choix) != 1) {
puts("Saisie invalide.");
return 1;
}
switch (choix) {
case 1: puts("Bonjour !"); break;
case 2: puts("Aide : choisir un numero."); break;
default: puts("Choix inconnu."); break;
}
return 0;
}| Instruction ou étape | Explication |
|---|---|
| Lecture | choix n’est utilisé que si la conversion entière réussit. |
| case 1 | Affiche Bonjour puis quitte le switch ; case 2 n’est pas exécuté. |
| default | Une valeur comme 7 reçoit un message explicite. |
| break | Sort du switch, puis main atteint return 0. |
Sortie écran : essai 1
Le premier case est choisi.
Choisir 1 (bonjour) ou 2 (aide) :
1
Bonjour !Sortie écran : essai 2
Le deuxième case est choisi.
Choisir 1 (bonjour) ou 2 (aide) :
2
Aide : choisir un numero.Sortie écran : essai 3
Aucun case ne correspond.
Choisir 1 (bonjour) ou 2 (aide) :
7
Choix inconnu.Choix : sauter et arrêter des tours
#include <stdio.h>
int main(void) {
for (int i = 1; i <= 6; ++i) {
if (i == 2) { continue; }
if (i == 5) { break; }
printf("%d\n", i);
}
return 0;
}| Instruction ou étape | Explication |
|---|---|
| i=1 | Aucun test ne coupe le tour : affichage de 1. |
| i=2 | continue saute printf, mais le ++i du for est exécuté. |
| i=3 et i=4 | Affichages de 3 puis 4. |
| i=5 | break termine la boucle avant l’affichage ; 6 n’est jamais visité. |
Sortie écran : essai 1
Le tour 2 est sauté ; la boucle est arrêtée à 5.
1
3
4S’entraîner et vérifier
Exercice 1. Que changer pour accepter aussi le choix 3 comme une demande d’aide ?
Voir la correctionMasquer la correction
Placer case 3: juste avant case 2: afin que les deux étiquettes partagent le même message et le même break. Il s’agit d’un regroupement intentionnel.
Exercice 2. Un break quitte-t-il deux boucles imbriquées ?
Voir la correctionMasquer la correction
Non, il quitte la boucle ou le switch le plus proche qui l’entoure. Pour sortir de plusieurs niveaux, restructurer le calcul, utiliser une condition commune ou une fonction et return.
Pratiquer avec le TD/TP 1 corrigé · Tous les exercices C.
Repère de lecture : les codes proposés utilisent des constructions disponibles en C11. Les règles du langage et de sa bibliothèque sont consultables dans les projets publics du WG14 (C11) et du WG14 (C23). Les exemples n’utilisent pas les nouveautés propres à C23.
Questions / Réponses
Ajouter un commentaire