• 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 fonctionsvoid exit(int status)qui termine l’exécution du programme etvoid longjmp(jmp_buf env, int val)qui permet de sauter à un point de reprise mis dans le programme.

6.3.1

continue

L’instructioncontinueest 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 dubreakdans leswitch. 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 instructionsif,

for, unwhileou undo 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.

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’instructionbreak. Lorsque le retour chariot

64 6.3. RUPTURES DE SÉQUENCE

FIG. 6.4 –breaketcontinuedans unfor

FIG. 6.5 –breaketcontinuedans unwhile

(’\r’) est rencontré, lebreakprovoque la sortie de la bouclefor. Il en serait de même avec unwhile

ou undo 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 lebreakpour 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 dubreaket ducontinue

sur les bouclesfor,while, etdo 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 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 “

:

” .

CHAPITRE 6. INSTRUCTIONS DE CONTRÔLE 65

FIG. 6.6 –breaketcontinuedans undo while

Le programme 6.12 est un extrait de la suite de tests du compilateurgcc. 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 fonctiontest_goto1()successivement avec les valeurs 0 et 1 puis la fonctiontest_goto2avec 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’instructionreturnpro- 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.

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

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

– return ;

– return expression ;

Il peut y avoir plusieursreturndans 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 :0si elle lit une majuscule,1si elle lit une minuscule,2si elle lit un chiffre,-1si elle litEOFet-2dans tous les autres cas.

6.4

Exercices sur les instructions de contrôle

Documents relatifs