Académique Documents
Professionnel Documents
Culture Documents
Programmation C/Itrations
Boucle for
Syntaxe
for (initialisation ; condition ; itration) bloc Une boucle for commence par l' initialisation, puis excute le bloc de code tant que la condition est vrifie et en appelant l'itration aprs chaque bloc. On peut tout de suite remarquer que la boucle for du C est beaucoup plus puissante qu'une boucle for classique, dans le sens o elle ne correspond pas forcment un nombre fini de tours de boucle. La norme C99 permet maintenant de dclarer des variables dans la partie initialisation de la boucle for. Ces variables ne peuvent qu'tre de classe automatic ou register. Leur porte est limite la boucle. Elles n'interfrent pas avec les variables de mme nom dclares en dehors de la boucle. Leur utilisation pourrait conduire de possibles optimisations du code par le compilateur.
Exemples
Exemple 1 int i; for (i = 0 ; i < 10 ; i++) { printf("%d\n", i); } En C99 : for (int i = 0 ; i < 10 ; i++) { printf("%d\n", i); } Cet exemple est une boucle for normale, l'indice de boucle i est incrment chaque tour et le bloc ne fait qu'afficher l'indice. Ce code affiche donc les 10 premiers entiers en partant de 0. Le bloc de code tant rduit une instruction, on aurait pu crire : int i; for (i = 0 ; i < 10 ; i++) printf("%d\n", i); Exemple 2 int i = 0; for( ; i != 1 ; i = rand() % 4) { printf("je continue\n"); }
Programmation C/Itrations Ce deuxime exemple montre plusieurs choses : 1. l'initialisation de la boucle a t omise, en fait n'importe laquelle des trois parties peut l'tre (et mme les trois la fois, ce qui rsulte en une boucle infinie) ; 2. l'expression itration est rellement une expression, on peut y faire appel des fonctions ; 3. le nombre d'itrations n'est pas fixe, le programme affichera je continue un nombre (pseudo-)alatoire de fois.
Boucle while
Syntaxe
while (condition) bloc Une boucle while excute le bloc d'instructions tant que la condition est vrifie.
Exemple
int i = 0; while (i < 10) { printf("%d\n", i); i = i + 1; } Cet exemple est le mme que celui vu prcdement pour la boucle for, il affiche les dix premiers entiers partir de 0.
Boucle do-while
Syntaxe
do bloc while (condition); Cette boucle est une lgre variante de la prcdente. Elle excute donc le bloc au moins une fois, et ce jusqu' ce que la condition soit fausse (ou tant que la condition est vraie).
Exemple 1
#include <stdio.h> int main(void) { int i = 0; do { printf("%d\n", i); i = i + 1; } while (i < 10); return 0;
Programmation C/Itrations } Exemple identique celui de la boucle while au dessus, on affiche les nombres de 0 jusqu' 9.
Exemple 2
#include <stdio.h> int main(void) { char c; do { printf("Veuillez taper la lettre 'o'\n"); scanf("%c", &c); } while (c != 'o'); return 0; } Cette fois on voit l'utilit de la boucle do-while, la variable est initialise dans la boucle. On doit tester sa valeur la fin de l'itration. Tant que l'utilisateur n'aura pas tap la lettre o, le programme redemandera de taper la lettre.
Programmation C/Itrations { struct Evenement_t * event; attend_evenement(); while ((event = retire_evenement())) { switch (event->type) { case FIN_TRAITEMENT: goto fin; /* ... */ } } } fin: /* ... */ } Dans ce cas de figure, il serait possible d'utiliser aussi un boolen qui indique que le traitement est termin, pour forcer la sortie des boucles. L'utilisation de goto dans cet exemple ne nuisant pas la lisibilit du programme et tant tout aussi efficace, il est tout fait lgitime de l'utiliser. Il faut cependant noter que cette instruction est souvent considre comme viter. En effet, elle provoque un saut dans le code, qui se voit beaucoup moins bien que les structures de contrle comme if ou while, par exemple. De fait, la pratique a montr qu'un abus de son utilisation rend un code source rapidement peu comprhensible, et difficilement maintenable. L'article de Edsger W. Dijsktra Go to considered harmful [1] (en), datant de 1968, est l'exemple le plus connu de cette critique, qui a donn naissance la programmation structure.
Rfrences
[1] http:/ / www. acm. org/ classics/ oct95/
Licence
Creative Commons Attribution-Share Alike 3.0 Unported http:/ / creativecommons. org/ licenses/ by-sa/ 3. 0/