Section 4.1

Boucle tant que

while, do/while, et la seule chose qui empêche une boucle de tourner sans fin.

Une condition, et un bloc qu’on refait tant qu’elle tient.

@entry(demarrer)
object MonProgramme {
    demarrer() {
        var reste := 3;

        while (reste > 0) {
            Console.print(text: $"compte à rebours : {reste}");
            reste := reste - 1;
        }

        Console.print(text: "terminé");
    }
}

Trois tours, puis terminé.

Comment while procède

Il teste la condition avant chaque tour. Si elle est vraie, il exécute le bloc, puis recommence : tester, exécuter, tester, exécuter. Dès qu’elle est fausse, il passe à la suite du programme.

Le corps peut donc ne s’exécuter aucune fois. Donnez à reste la valeur 0 au départ, et le programme n’affiche que terminé — la condition était fausse dès la première question.

La ligne sans laquelle rien ne s’arrête

reste := reste - 1;

C’est la ligne la plus importante des trois. Sans elle, reste vaut toujours 3, la condition est toujours vraie, et la boucle tourne sans fin — le programme n’affiche plus jamais terminé, et il faut l’interrompre.

Retenez la règle : une boucle ne s’arrête que si son corps rapproche la condition de la fausseté. Le compilateur ne le vérifie pas — il ne peut pas, en général — donc c’est à vous de le tenir. Essayez : retirez la ligne, exécutez, et regardez ce qui se passe.

do / while — tester à l’autre bout

La même boucle existe avec la condition après le corps :

do {
    Console.print(text: $"compte à rebours : {reste}");
    reste := reste - 1;
} while (reste > 0);

La différence tient en une phrase : le corps s’exécute toujours au moins une fois, puisque la question n’est posée qu’après. C’est ce qu’on veut quand l’action doit avoir lieu avant qu’on puisse décider s’il faut la refaire.

Notez le ; après la condition fermante. Ici, l’accolade ne termine pas l’instruction — la condition la suit, et c’est le point-virgule qui clôt.

À vous

  • Mettez reste à 0 au départ : la boucle ne s’exécute pas une seule fois.
  • Retirez reste := reste - 1; et exécutez. Vous verrez ce qu’est une boucle infinie — ici, le bac à sable l’arrête parce que la sortie devient trop longue, et vous le dit. Sans cette garde, elle tournerait indéfiniment.
  • Réécrivez la boucle en do/while avec reste à 0 au départ, et comparez : elle affiche une ligne là où while n’en affichait aucune.