En langage C, il existe trois principales structures répétitives : for, while et do-while. Leur apparition est liée à la nécessité d'effectuer des calculs répétitifs, de faciliter le parcours des structures de données et d'automatiser le traitement des tableaux. La syntaxe des boucles a d'abord été introduite dans des langages de programmation précoces (Algol, Fortran) et a été adaptée à la syntaxe C pour améliorer la lisibilité et le contrôle du flux.
Historique
À l'origine, les programmeurs utilisaient des étiquettes et goto pour organiser des actions répétitives, ce qui entraînait rapidement un code difficile à lire (spaghetti code). L'introduction des boucles structurelles (en C — depuis 1972) a permis d'uniformiser l'approche de la répétition et de la description de la logique des programmes.
Problème
La principale tâche des boucles est de déterminer combien de fois une action donnée doit être répétée et comment contrôler la sortie de la boucle. Il est important de choisir correctement le type de boucle en fonction de savoir si le nombre de répétitions est connu à l'avance, si le corps doit être exécuté au moins une fois et s'il est nécessaire de calculer l'état de sortie à l'avance.
Solution
Exemple de code :
#include <stdio.h> int main() { int i = 0; // Exemple de boucle while while (i < 3) { printf("while: %d\n", i); i++; } // Exemple de boucle for for (int j = 0; j < 3; j++) { printf("for: %d\n", j); } // Exemple de boucle do-while int k = 0; do { printf("do-while: %d\n", k); k++; } while (k < 3); return 0; }
Caractéristiques clés :
Quelle est la différence entre while(1) et for(;;) et lequel est préférable à utiliser pour une boucle infinie ?
Réponse : Les deux variantes créent une boucle infinie et se traduisent par le même code machine, il n'y a pas de différence de performance. On utilise généralement for(;;) pour montrer clairement qu'aucune initialisation, condition de sortie ou étape n'est attendue.
for(;;) { // boucle infinie } // ou while(1) { // boucle infinie }
Peut-on modifier la variable de boucle à l'intérieur du corps du for et que se passera-t-il ?
Réponse : Modifier la variable du compteur (par exemple, i++) dans le corps de la boucle for entraînera un nombre d'itérations imprévisible. De telles modifications déroutent ceux qui lisent et compliquent le débogage.
for (int i = 0; i < 10; i++) { printf("%d\n", i); i += 2; // modification non standard de l'étape ! }
Que se passera-t-il si le corps de la boucle est laissé vide ? Dans quels cas cela a-t-il du sens ?
Réponse : Un corps de boucle vide est acceptable et est utilisé pour attendre un événement ou préparer des données :
while(*src++ = *dst++); // copie de chaîne jusqu'au caractère '\0'
Cas négatif
Dans le projet, on a utilisé for avec modification de la variable compteur à l'intérieur du corps, ce qui a conduit à un nombre incorrect d'éléments traités, des bugs et des difficultés lors du débogage.
Avantages :
Inconvénients :
Cas positif
Utilisation de for pour parcourir un tableau de longueur fixe sans modifier le compteur de l'extérieur :
Avantages :
Inconvénients :