Une condition peut être fausse dès le départ, tout en exigeant une première action. C’est précisément le cas auquel répond la structure do while, très présente en JavaScript, Java, C, C++ et C#. Je vous montre ici son fonctionnement, ses différences avec les autres boucles, ses usages concrets et les erreurs qui provoquent les boucles infinies.
Une boucle pensée pour agir avant de vérifier
- Exécution garantie : le bloc tourne au moins une fois.
- Condition finale : le test intervient après chaque passage.
- Usage idéal : menus, saisies utilisateur et tentatives répétées.
- Risque principal : oublier de modifier la valeur contrôlée.
-
Alternative Python : utiliser
while Trueavecbreak.
Le principe qui change tout dans une boucle
Une boucle do...while exécute d’abord un bloc d’instructions, puis vérifie si elle doit recommencer. La condition arrive donc à la fin, contrairement à une boucle while classique qui teste la situation avant d’entrer dans le bloc.
Cette différence paraît minime, mais elle modifie complètement le comportement du programme. Même si la condition est fausse dès le départ, le contenu du bloc sera exécuté au moins une fois. C’est utile lorsqu’une première action est obligatoire avant de pouvoir prendre une décision.
do {
instruction;
} while (condition);
Le point-virgule final est important dans les langages de la famille C. En JavaScript, par exemple, la condition est évaluée après le premier passage. Si elle renvoie true, le bloc recommence. Si elle renvoie false, le programme poursuit son exécution après la boucle.
Comment suivre son déroulement étape par étape
Pour comprendre cette structure, je conseille de suivre trois éléments à chaque tour. Il faut identifier l’action réalisée, la valeur modifiée et le résultat du test final. Cette méthode permet de repérer rapidement une condition qui ne pourra jamais devenir fausse.
let tentative = 0;
do {
tentative += 1;
console.log(`Tentative ${tentative}`);
} while (tentative < 3);
Voici ce qui se passe concrètement. La variable commence à zéro, puis passe à 1 lors du premier tour. Le test confirme que 1 est inférieur à 3, la boucle continue, puis le même mécanisme se répète avec 2 et 3. Après la troisième tentative, l’expression 3 < 3 devient fausse et l’exécution s’arrête.
| Tour | Valeur de tentative
|
Résultat du test |
|---|---|---|
| 1 | 1 | Vrai, on recommence |
| 2 | 2 | Vrai, on recommence |
| 3 | 3 | Faux, on sort |
Dans mes revues de code, je vois souvent des débutants lire cette boucle comme si la condition était placée en haut. C’est le piège principal. Pour éviter l’erreur, je me pose toujours cette question simple : que se passe-t-il lors du tout premier passage?
Choisir entre do...while, while et for
Ces trois structures répètent des instructions, mais elles ne répondent pas au même besoin. Le bon choix dépend surtout du moment où la condition peut être connue et de la manière dont le nombre de passages est déterminé.
| Structure | Moment du test | Cas recommandé | Point de vigilance |
|---|---|---|---|
do...while |
Après le bloc | Une première action est toujours nécessaire | Le bloc s’exécute même si la condition est fausse |
while |
Avant le bloc | Le bloc peut ne jamais être exécuté | La condition doit être vraie dès l’entrée |
for |
Avant chaque tour | Un compteur ou une collection contrôle la répétition | La syntaxe devient vite confuse si la logique est complexe |
Si je dois parcourir une liste connue, je préfère généralement for ou for...of. Pour attendre qu’un état change, while est souvent plus lisible. En revanche, pour afficher un menu au moins une fois ou demander une saisie avant de la valider, do...while est plus naturel.
Une particularité utile selon les langages
La structure existe dans plusieurs langages, avec une logique presque identique. JavaScript, Java, C, C++ et C# utilisent une forme proche. Python ne propose pas de mot-clé natif équivalent, mais on peut reproduire le comportement avec while True et une sortie explicite grâce à break.
while True:
valeur = input("Saisissez oui ou non : ")
if valeur in ("oui", "non"):
break
La syntaxe change, mais l’intention reste la même : réaliser une première tentative, puis recommencer uniquement si le résultat ne convient pas.
Les situations où cette boucle est vraiment pertinente
Valider une saisie utilisateur
Un formulaire ou un programme en console doit souvent demander une valeur au moins une fois. La boucle peut ensuite recommencer tant que la réponse ne respecte pas les règles prévues.
let age;
do {
age = Number(prompt("Quel âge avez-vous ?"));
} while (!Number.isInteger(age) || age < 0);
Ce modèle rend l’intention très claire. L’utilisateur reçoit une demande, le programme vérifie la réponse, puis recommence si la donnée est invalide. En pratique, je recommande toutefois d’ajouter un nombre maximal d’essais dans une application réelle afin d’éviter un blocage sans fin.
Afficher un menu interactif
Un menu doit généralement apparaître avant que le programme puisse décider de continuer ou de quitter. C’est l’un des exemples les plus faciles à comprendre.
let choix;
do {
choix = prompt("1. Afficher les données\n2. Quitter");
if (choix === "1") {
console.log("Données affichées");
}
} while (choix !== "2");
La sortie dépend ici de la réponse de l’utilisateur. Le menu apparaît toujours une première fois, puis reste actif tant que l’option de sortie n’a pas été choisie. Pour une interface graphique moderne, des événements sont souvent préférables, mais ce modèle reste très pratique pour les scripts et les exercices.
Lire aussi : Apprendre à coder - Combien de temps faut-il vraiment ?
Répéter une tentative avec une limite
Une opération réseau, une lecture de fichier ou une connexion peut échouer temporairement. Une boucle de répétition peut alors être pertinente, à condition de prévoir une limite et, si nécessaire, un délai entre deux essais.
let essais = 0;
let succès = false;
do {
essais += 1;
succès = effectuerOperation();
} while (!succès && essais < 3);
La limite de 3 essais n’est pas une règle universelle. Elle dépend du service, du temps d’attente acceptable et du risque de répéter une action déjà enregistrée. Pour un paiement ou une création de compte, répéter automatiquement une requête peut même produire un doublon.
Les erreurs qui provoquent les boucles infinies
Le problème le plus fréquent est une variable de contrôle qui ne change jamais. Si la condition reste vraie à chaque passage, le programme continue indéfiniment et peut consommer inutilement du temps processeur ou bloquer une interface.
let nombre = 1;
do {
console.log(nombre);
} while (nombre < 5);
Dans cet exemple, nombre reste égal à 1. La correction consiste à faire évoluer cette valeur dans le bloc.
let nombre = 1;
do {
console.log(nombre);
nombre += 1;
} while (nombre < 5);
- Modifier la variable testée à chaque tour lorsque c’est nécessaire.
- Vérifier que la condition peut réellement devenir fausse.
- Éviter les comparaisons ambiguës entre texte et nombres.
- Utiliser
breakuniquement pour une sortie exceptionnelle et lisible. - Employer
continueavec prudence, car il peut masquer une mise à jour placée trop bas.
Une autre erreur classique consiste à placer une instruction importante après continue. Elle ne sera alors jamais exécutée lors du tour concerné. Avant de valider une boucle, je teste toujours les trois cas essentiels : condition fausse au premier passage, condition vraie plusieurs fois et arrêt après la dernière répétition.
Le bon réflexe avant d’utiliser cette structure
La question décisive est simple : l’action doit-elle vraiment avoir lieu une première fois? Si la réponse est non, une boucle while sera probablement plus sûre. Si la réponse est oui, la structure étudiée ici traduit directement cette intention dans le code.
Je conseille aussi de rendre la sortie visible dans le code. Un compteur, un état mis à jour ou une condition clairement nommée facilite la lecture et le débogage. Une boucle courte et explicite vaut mieux qu’une logique compacte qui oblige le prochain développeur à deviner quand elle s’arrête.
Bien maîtrisée, cette construction n’est pas seulement une variante de while. Elle sert à représenter un scénario précis : agir, vérifier, puis recommencer si nécessaire. C’est cette logique qui la rend particulièrement utile pour les saisies, les menus et les tentatives contrôlées.