• Aucun résultat trouvé

Dans le cas où une boucle commande l’exécution d’un bloc d’instructions, il peut être intéressant de vouloir sortir de cette boucle alors que la condition de passage est encore valide. Ce type d’opération est appelé une rupture de séquence. Les ruptures de séquence sont utilisées lorsque des conditions multiples peuvent conditionner l’exécution d’un ensemble d’instructions.

Les ruptures de séquence sont réalisées par quatre instructions qui correspondent à leur niveau de travail :

1. continue 2. break 3. goto 4. return

Deux appels de fonctions de la bibliothèque permettent aussi de modifier l’ordre d’exécution d’un programme. Il s’agit de l’appel aux fonctions void exit(int status) qui termine l’exécution du programme et void longjmp(jmp_buf env, int val) qui permet de sauter à un point de reprise mis dans le programme.

6.3.1

continue

L’instruction continue est utilisée en relation avec les boucles. Elle provoque le passage à l’itération suivante de la boucle en sautant à la fin du bloc. Ce faisant, elle provoque la non exécution des instructions qui la suivent à l’intérieur du bloc.

Prenons le programme 6.9, qui compte le nombre de caractères non blancs rentrés au clavier, et le nombre total de caractères. Les caractères sont considérés comme blancs s’ils sont égaux soit à l’espace, la tabulation horizontale, le saut de ligne ou le retour à la colonne de numéro zéro. À la fin de l’exécution :

1. i contient une valeur qui correspond au nombre total de caractères qui ont été tapés au clavier ; 2. j contient une valeur qui correspond au nombre de caractères non blancs ;

3. et i-j contient une valeur qui correspond au nombre de caractères blancs.

6.3.2

break

Nous avons déjà vu une utilisation du break dans le switch. Plus généralement, il permet de sortir d’un bloc d’instruction associé à une instruction répétitive ou alternative contrôlée par les instructions if, for, un while ou un do while. Il n’est pas aussi général qu’en ADA ou en JAVA puisqu’il ne permet de sortir que d’un niveau d’imbrication.

64 6.3. RUPTURES DE SÉQUENCE

FIGURE6.4 – break et continue dans un for

FIGURE6.5 – break et continue dans un while

Dans l’exemple 6.10, nous reprenons l’exemple 6.9, de manière à créer une boucle qui compte le nombre de caractères jusqu’au retour chariot en utilisant l’instruction break. Lorsque le retour chariot (’\r’) est rencontré, le break provoque la sortie de la boucle for. Il en serait de même avec un while ou un do while.

Dans l’exemple 6.11, nous reprenons l’exemple 6.5, de manière à créer une boucle qui remplit le tableau en vérifiant qu’il n’y a pas de débordement de taille. Dans ce cas, nous utilisons le break pour sortir de la boucle lorsque la fin de fichier est rencontrée.

Les figures 6.4, 6.5 et 6.6 sont des organigrammes qui montre les effets du break et du continue sur les boucles for, while, et do while.

6.3.3

goto

Le goto permet d’aller n’importe où à l’intérieur d’une fonction. Son utilisation systématique nuit à la lisibilité des programmes. Il est cependant très utilisé après des détections d’erreur, car il permet de

CHAPITRE 6. INSTRUCTIONS DE CONTRÔLE 65

FIGURE6.6 – break et continue dans un do while

sortir de plusieurs blocs imbriqués. Il est associé à une étiquette appelée label. Un label est une chaîne de caractères suivie du double point “

:

” .

Le programme 6.12 est un extrait de la suite de tests du compilateur gcc. Dans ce programme : test_goto1() doit retourner 2 si l’argument qui lui est passé est différent de 0 et 1 sinon. test_goto2() doit retourner 8 si l’argument qui lui est passé est inférieur à 10 et 4 sinon.

main() provoque l’appel de la fonction test_goto1() successivement avec les valeurs 0 et 1 puis la fonction test_goto2 avec une valeur inférieure à 10 (3) et une valeur supérieure à 10 (30). Les résultats obtenus par les retours d’appels de fonctions sont cumulés dans la variable globale goto_val.

6.3.4

return

Nous étudierons de manière plus détaillée les fonctions dans le chapitre 8. L’instruction return pro- voque la terminaison de l’exécution de la fonction dans laquelle elle se trouve et le retour à la fonction appelante. Cette instruction peut être mise à tout moment dans le corps d’une fonction ; son exécution provoque la fin de celle-ci. Cette instruction est appelée de manière implicite à la fin d’une fonction.

Le return permet de calculer une valeur correspondant au type de sa fonction. Ce calcul se fait en évaluant l’expression qui suit le return. L’expression est évaluée et la valeur calculée est retournée à la fonction appelante.

Lorsque la fonction est de type void, le return est utilisé sans expression associée, dans le cas où la fonction est associée à un type qui n’est pas void, la valeur calculée par le return est celle que retourne la fonction contenant le return. Les formes possibles du return sont donc :

– return ;

– return expression ;

Il peut y avoir plusieurs return dans une fonction, le premier qui est exécuté dans le contexte de la fonction provoque : le calcul de la valeur à retourner, la sortie de la fonction, la continuation de l’exécution de la fonction appelante.

Nous allons créer une fonction (voir prog. 6.13) qui retourne : 0 si elle lit une majuscule, 1 si elle lit une minuscule, 2 si elle lit un chiffre, -1 si elle lit EOF et -2 dans tous les autres cas.

Documents relatifs