La première instruction que nous avons aperçue est la boucle
for. Elle permet de répéter un bout de code tant qu’une condition est vraie. Souvent cette condition est un compteur. Nous pouvons par exemple afficher un message 50 fois avec le code suivant :
Code : C# | int compteur;
for (compteur = 0; compteur < 50; compteur++)
{
Console.WriteLine("Bonjour C#");
}
|
Ce qui donne :
Nous définissons ici un entier « compteur ». Il est initialisé à 0 en début de boucle (compteur = 0). Après chaque exécution du bloc de code du
for, c’est-à-dire à chaque itération, il va afficher « Bonjour C# ».
À la fin de chaque itération, la variable compteur est incrémentée (compteur++) et nous recommençons l’opération tant que la condition « compteur < 50 » est vraie.
Bien sûr, la variable
compteur est accessible dans la boucle et change de valeur à chaque itération.
Code : C# | int compteur;
for (compteur = 0; compteur < 50; compteur++)
{
Console.WriteLine("Bonjour C# " + compteur);
}
|
Ce qui donne :
Ce précédent code affichera la valeur de la variable après chaque bonjour, donc de 0 à 49. En effet, quand compteur passe à 50, la condition n’est plus vraie et on passe aux instructions suivantes.
En général, on utilise la boucle
for pour parcourir un tableau. Ainsi, nous pourrons utiliser le compteur comme indice pour accéder aux éléments du tableau :
Code : C# | string[] jours = new string[] { "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche" };
int indice;
for (indice = 0; indice < 7; indice++)
{
Console.WriteLine(jours[indice]);
}
|
Dans cette boucle, comme à la première itération indice vaut 0, nous afficherons l’élément du tableau à la position 0, à savoir « Lundi ».
À l’itération suivante, indice passe à 1, nous affichons l’élément du tableau à la position 1, à savoir « Mardi », et ainsi de suite.
Ce qui donne :
Attention à ce que l’indice ne dépasse pas la taille du tableau, sinon l’accès à un indice en dehors des limites du tableau provoquera une erreur à l’exécution. Pour éviter ceci, on utilise en général la taille du tableau comme condition de fin :
Code : C# | string[] jours = new string[] { "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche" };
int indice;
for (indice = 0; indice < jours.Length; indice++)
{
Console.WriteLine(jours[indice]);
}
|
Ici
jours.Length renvoie la taille du tableau, à savoir 7.
Il est très courant de boucler sur un tableau en passant tous les éléments un par un, mais il est possible de changer les conditions de départ, les conditions de fin, et l’élément qui influe sur la condition de fin.
Ainsi, l’exemple suivant :
Code : C# | int[] chiffres = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
for (int i = 9; i > 0; i -= 2)
{
Console.WriteLine(chiffres[i]);
}
|
Permet de parcourir le tableau de 2 en 2 en commençant par la fin.
Ce qui nous donne :
Vous avez pu voir que dans cet exemple, nous avons défini l’entier
i directement dans l’instruction
for, c’est une commodité qui nous permet d’avoir la variable
i qui n’existe qu’à l’intérieur de la boucle, car sa portée correspond aux accolades qui délimitent le
for.
Attention, il est possible de faire un peu tout et n’importe quoi dans ces boucles. Aussi il peut arriver que l’on se retrouve avec des bugs, comme des boucles infinies.
Par exemple, le code suivant :
Code : C# | for (int indice = 0; indice < 7; indice--)
{
Console.WriteLine("Test" + indice);
}
|
est une boucle infinie. En effet, on modifie la variable indice en la décrémentant. Sauf que la condition de sortie de la boucle est valable pour un indice qui dépasse ou égale la valeur 7, ce qui n’arrivera jamais.
Si on exécute l’application avec ce code, la console va afficher à l’infini le mot « Test » avec son indice. La seule solution pour quitter le programme sera de fermer brutalement l’application.
L’autre solution est d’attendre que le programme se termine...
Mais tu viens de dire que la boucle était infinie ?
Oui c’est vrai, mais en fait, ici on se heurte à un cas limite du C#. C’est à cause de la variable indice. indice est un entier que l’on décrémente. Au début il vaut zéro, puis -1, puis -2, etc …
Lorsque la variable indice arrive à la limite inférieure que le type int est capable de gérer, c’est-à-dire -2147483648 alors il y a ce qu’on appelle un
dépassement de capacité. Sans rentrer dans les détails, il ne peut pas stocker un entier plus petit et donc il boucle et repart à l’entier le plus grand, c’est-à-dire 2147483647.
Donc pour résumer, l’indice fait :
- 0
- -1
- -2
- ...
- -2147483647
- -2147483648
- +2147483647
Et comme là, il se retrouve supérieur à 7, la boucle se termine.
Donc, techniquement, ce n’est pas une boucle infinie, mais bon, on a attendu tellement longtemps pour atteindre ce cas limite que c’est tout comme.
Et surtout, nous tombons sur un cas imprévu. Ici, ça se termine « plutôt bien », mais ça aurait pu finir en crash de l’application.
Dans tous les cas, il faut absolument maîtriser ses conditions de sortie de boucle pour éviter la boucle infinie, un des cauchemars du développeur !