instruction :
switch ( expression )
{
case expression1 : liste-d'instructions
break;option
case expression2 : liste-d'instructions
break;option
....
case expressionn : liste-d'instructions
break;option
default : liste-d'instructions
}
De plus :
enum {BLEU=1, BLANC, ROUGE}; void print_color(int color) { switch(color) { case BLEU : printf("bleu"); break; case BLANC : printf("blanc"); break; case ROUGE : printf("rouge"); break; default : printf("erreur interne du logiciel numéro xx\n"); } }
Deuxième possibilité, on peut avoir une ou plusieurs alternatives ne possédant ni liste-d'instructions, ni break;. Supposons que l'on désire compter dans une suite de caractères, le nombre de caractères qui sont des chiffres, et le nombre de caractères qui ne le sont pas. On peut utiliser le switch suivant :
switch(c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': nb_chiffres++; break; default: nb_non_chiffres++; }
Troisième possibilité, une alternative peut ne pas avoir de break comme dans l'exemple suivant :
enum {POSSIBLE, IMPOSSIBLE}; void print_cas(int cas) { switch (cas) { case IMPOSSIBLE: printf("im"); case POSSIBLE: printf("possible\n"); break; case default: printf("erreur interne du logiciel numéro xx\n"); } }Une telle utilisation du switch pose un problème de lisibilité, car l'expérience montre que l'absence du break; est très difficile à voir. Il est donc recommandé de mettre un commentaire, par exemple de la façon suivante :
case IMPOSSIBLE: printf("im"); /* ATTENTION: pas de break; */
instruction :
goto identificateur ;
Toute instruction peut être précédée d'un identificateur suivi du signe :. Cet identificateur est appelé étiquette. Une instruction goto identificateur a pour effet de transférer le contrôle d'exécution à l'instruction étiquetée par identificateur. L'instruction goto et l'instruction cible du goto doivent se trouver dans la même procédure : le langage C est un langage à branchement locaux.
{ etiq2: ... /* des instructions */ goto etiq1; /* goto avant définition de l'étiquette */ ... /* des instructions */ etiq1: ... /* des instructions */ goto etiq2; /* goto après définition de l'étiquette */ }
instruction :
;
ne rien faire !
Cette instruction ne rend que des services syntaxiques. Elle peut être utile quand on désire mettre une étiquette à la fin d'une instruction composée. Par exemple :
{ ... fin: ; }
Elle est également utile pour mettre un corps nul à certaines instructions itératives. En effet, à cause des effets de bord dans les expressions, on peut arriver parfois à faire tout le travail dans les expressions de contrôle des instructions itératives. Par exemple, on peut initialiser à zéro un tableau de la manière suivante :
for (i = 0; i < N; t[i++]= 0) ; /* instruction nulle */
for (i = 0; i < N; i++) t[i] = i;si par mégarde on met un ; à la fin de ligne du for, on obtient un programme parfaitement correct, qui s'exécute sans broncher, mais ne fait absolument pas ce qui était prévu. En effet :
for (i = 0; i < N; i++) ; t[i] = i;exécute le for avec le seul effet d'amener la variable i à la valeur N, et ensuite exécute une fois t[i] = i ce qui a probablement pour effet d'écraser la variable déclarée juste après le tableau t.