IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Cours de C/C++


précédentsommairesuivant

2. Les structures de contrôle

Nous allons aborder dans ce chapitre un autre aspect du langage indispensable à la programmation, à savoir : les structures de contrôle. Ces structures permettent, comme leur nom l'indique, de contrôler l'exécution du programme en fonction de critères particuliers. Le C et le C++ disposent de toutes les structures de contrôle classiques des langages de programmation comme les tests, les boucles, les sauts, etc. Toutes ces structures sont décrites dans les sections suivantes.

2.1. La structure conditionnelle if

La structure conditionnelle if permet de réaliser un test et d'exécuter une instruction ou non selon le résultat de ce test. Sa syntaxe est la suivante :

 
Sélectionnez
if (test) opération;

test est une expression dont la valeur est booléenne ou entière. Toute valeur non nulle est considérée comme vraie. Si le test est vrai, opération est exécuté. Ce peut être une instruction ou un bloc d'instructions. Une variante permet de spécifier l'action à exécuter en cas de test faux :

 
Sélectionnez
if (test) opération1;
else opération2;

Note : Attention ! Les parenthèses autour du test sont nécessaires !

Les opérateurs de comparaison sont les suivants :

Tableau 2-1. Opérateurs de comparaison

== égalité
!= inégalité
< infériorité
> supériorité
<= infériorité ou égalité
>= supériorité ou égalité

Les opérateurs logiques applicables aux expressions booléennes sont les suivants :

Tableau 2-2. Opérateurs logiques

&& et logique
|| ou logique
! négation logique

Il n'y a pas d'opérateur ou exclusif logique.

Exemple 2-1. Test conditionnel if
Sélectionnez
if (a<b && a!=0)
{
    m=a;
    nouveau_m=1;
}

2.2. La boucle for

La structure de contrôle for est sans doute l'une des plus importantes. Elle permet de réaliser toutes sortes de boucles et, en particulier, les boucles itérant sur les valeurs d'une variable de contrôle. Sa syntaxe est la suivante :

 
Sélectionnez
for (initialisation ; test ; itération) opération;

initialisation est une instruction (ou un bloc d'instructions) exécutée avant le premier parcours de la boucle du for. test est une expression dont la valeur déterminera la fin de la boucle. itération est l'opération à effectuer en fin de boucle, et opération constitue le traitement de la boucle. Chacune de ces parties est facultative.

La séquence d'exécution est la suivante :

 
Sélectionnez
initialisation
test : saut en fin du for ou suite
    opération
    itération
    retour au test
fin du for.
Exemple 2-2. Boucle for
Sélectionnez
somme = 0;
for (i=0; i<=10; i=i+1) somme = somme + i;

Note : En C++, il est possible que la partie initialisation déclare une variable. Dans ce cas, la variable déclarée n'est définie qu'à l'intérieur de l'instruction for. Par exemple,

 
Sélectionnez
for (int i=0; i<10; ++i);

est strictement équivalent à :

 
Sélectionnez
{
    int i;
    for (i=0; i<10; ++i);
}

Cela signifie que l'on ne peut pas utiliser la variable i après l'instruction for, puisqu'elle n'est définie que dans le corps de cette instruction. Cela permet de réaliser des variables muettes qui ne servent qu'à l'instruction for dans laquelle elles sont définies.

Note : Cette règle n'est pas celle utilisée par la plupart des compilateurs C++. La règle qu'ils utilisent spécifie que la variable déclarée dans la partie initialisation de l'instruction for reste déclarée après cette instruction. La différence est subtile, mais importante. Cela pose assurément des problèmes de compatibilité avec les programmes C++ écrits pour ces compilateurs, puisque dans un cas la variable doit être redéclarée et dans l'autre cas elle ne le doit pas. Il est donc recommandé de ne pas déclarer de variables dans la partie initialisation des instructions for pour assurer une portabilité maximale.

2.3. Le while

Le while permet d'exécuter des instructions en boucle tant qu'une condition est vraie. Sa syntaxe est la suivante :

 
Sélectionnez
while (test) opération;

opération est effectuée tant que test est vérifié. Comme pour le if, les parenthèses autour du test sont nécessaires. L'ordre d'exécution est :

 
Sélectionnez
test
opération
Exemple 2-3. Boucle while
Sélectionnez
somme = i = 0;
while (somme<1000)
{
    somme = somme + 2 * i / (5 + i);
    i = i + 1;
}

2.4. Le do

La structure de contrôle do permet, tout comme le while, de réaliser des boucles en attente d'une condition. Cependant, contrairement à celui-ci, le do effectue le test sur la condition après l'exécution des instructions. Cela signifie que les instructions sont toujours exécutées au moins une fois, que le test soit vérifié ou non. Sa syntaxe est la suivante :

 
Sélectionnez
do opération;
while (test);

opération est effectuée jusqu'à ce que test ne soit plus vérifié.

L'ordre d'exécution est :

 
Sélectionnez
opération
test
Exemple 2-4. Boucle do
Sélectionnez
p = i = 1;
do
{
    p = p * i;
    i = i + 1;
} while (i != 10);

2.5. Le branchement conditionnel

Dans le cas où plusieurs instructions différentes doivent être exécutées selon la valeur d'une variable de type intégral, l'écriture de if successifs peut être relativement lourde. Le C/C++ fournit donc la structure de contrôle switch, qui permet de réaliser un branchement conditionnel. Sa syntaxe est la suivante :

 
Sélectionnez
switch (valeur)
{
case cas1:
   [instruction;
    [break;]
   ]
case cas2:
   [instruction;
    [break;]
   ]
   &vellip;
case casN:
   [instruction;
    [break;]
   ]
[default:
   [instruction;
    [break;]
   ]
]
}

valeur est évalué en premier. Son type doit être entier. Selon le résultat de l'évaluation, l'exécution du programme se poursuit au cas de même valeur. Si aucun des cas ne correspond et si default est présent, l'exécution se poursuit après default. Si en revanche default n'est pas présent, on sort du switch.

Les instructions qui suivent le case approprié ou default sont exécutées. Puis, les instructions du cas suivant sont également exécutées (on ne sort donc pas du switch). Pour forcer la sortie du switch, on doit utiliser le mot clé break.

Exemple 2-5. Branchement conditionnel switch
Sélectionnez
i= 2;
switch (i)
{
case 1:
case 2:    /* Si i=1 ou 2, la ligne suivante sera exécutée. */
    i=2-i;
    break;
case 3:
    i=0;   /* Cette ligne ne sera jamais exécutée. */
default:
    break;
}

Note : Il est interdit d'effectuer une déclaration de variable dans un des case d'un switch.

2.6. Le saut

Le C/C++ dispose d'une instruction de saut permettant de poursuivre l'exécution du programme en un autre point. Bien qu'il soit fortement déconseillé de l'utiliser, cette instruction est nécessaire et peut parfois être très utile, notamment dans les traitements d'erreurs. Sa syntaxe est la suivante :

 
Sélectionnez
goto étiquette;

étiquette est une étiquette marquant la ligne destination dans la fonction. Les étiquettes sont simplement déclarées avec la syntaxe suivante :

 
Sélectionnez
étiquette:

Les étiquettes peuvent avoir n'importe quel nom d'identificateur.

Il n'est pas possible d'effectuer des sauts en dehors d'une fonction. En revanche, il est possible d'effectuer des sauts en dehors et à l'intérieur des blocs d'instructions sous certaines conditions. Si la destination du saut se trouve après une déclaration, cette déclaration ne doit pas comporter d'initialisations. De plus, ce doit être la déclaration d'un type simple (c'est-à-dire une déclaration qui ne demande pas l'exécution de code) comme les variables, les structures ou les tableaux. Enfin, si, au cours d'un saut, le contrôle d'exécution sort de la portée d'une variable, celle-ci est détruite.

Note : Ces dernières règles sont particulièrement importantes en C++ si la variable est un objet dont la classe a un constructeur ou un destructeur non trivial. Voir le Chapitre 8 pour plus de détails à ce sujet.

Autre règle spécifique au C++ : il est impossible d'effectuer un saut à l'intérieur d'un bloc de code en exécution protégée try {}. Voir aussi le Chapitre 9 concernant les exceptions.

2.7. Les commandes de rupture de séquence

En plus du goto vu précédemment, il existe d'autres commandes de rupture de séquence (c'est-à-dire de changement de la suite des instructions à exécuter). Ces commandes sont les suivantes :

 
Sélectionnez
continue;
 
ou 
 
break;
 
ou 
 
return [valeur];

return permet de quitter immédiatement la fonction en cours. Comme on l'a déjà vu, la commande return peut prendre en paramètre la valeur de retour de la fonction.

break permet de passer à l'instruction suivant l'instruction while, do, for ou switch la plus imbriquée (c'est-à-dire celle dans laquelle on se trouve).

continue saute directement à la dernière ligne de l'instruction while, do ou for la plus imbriquée. Cette ligne est l'accolade fermante. C'est à ce niveau que les tests de continuation sont faits pour for et do, ou que le saut au début du while est effectué (suivi immédiatement du test). On reste donc dans la structure dans laquelle on se trouvait au moment de l'exécution de continue, contrairement à ce qui se passe avec le break.

Exemple 2-6. Rupture de séquence par continue
Sélectionnez
/* Calcule la somme des 1000 premiers entiers pairs : */
somme_pairs=0;
for (i=0; i<1000; i=i+1)
{
    if (i % 2 == 1) continue;
    somme_pairs=somme_pairs + i;
}

précédentsommairesuivant

Copyright © 2003 Christian Casteyde. Permission vous est donnée de copier, distribuer et modifier ce document selon les termes de la licence GNU pour les documentations libres, version 1.1 ou toute autre version ultérieure publiée par la Free Software Foundation. Une copie de cette licence est incluse dans l'annexe intitulée "GNU Free Documentation License". Vous trouverez également une traduction non officielle de cette licence dans l'annexe intitulée "Licence de documentation libre GNU".