96 votes

"faire... pendant" ou "pendant" ?

Duplicatas possibles :
While vs. Do While
Quand dois-je utiliser les boucles do-while au lieu des boucles while ?

Je programme depuis un certain temps maintenant (2 ans de travail + 4,5 ans de diplôme + 1 an de pré-collège), et je n'ai jamais utilisé de boucle do-while avant d'y être forcé dans le cours d'introduction à la programmation. J'ai de plus en plus l'impression que je fais mal la programmation si je ne me heurte jamais à quelque chose d'aussi fondamental.

Se pourrait-il que je n'aie pas rencontré les bonnes circonstances ?

Quels sont les exemples où il serait nécessaire d'utiliser un do-while au lieu d'un while ?

(Ma scolarité s'est déroulée presque entièrement en C/C++ et mon travail est en C#, donc s'il existe un autre langage où cela a absolument du sens parce que les do-whiles fonctionnent différemment, alors ces questions ne s'appliquent pas vraiment).

Pour clarifier...je connais la différence entre un while et un do-while . While vérifie la condition de sortie et exécute ensuite les tâches. do-while effectue des tâches et vérifie ensuite les conditions de sortie.

48 votes

Pour ce que ça vaut, après une décennie de programmation dans ma carrière, j'ai utilisé une boucle do-while une ou deux fois.

0 votes

@Matt - Cela me fait me sentir mieux. Au moins, cela signifie que je ne suis pas seul.

2 votes

Je suis d'accord avec Matt et j'ajouterai une autre décennie à cela. Je n'utilise jamais la boucle do-while non plus.

127voto

Bob Moore Points 4432

Si vous voulez que la boucle s'exécute toujours au moins une fois. Ce n'est pas courant, mais je l'utilise de temps en temps. Un cas où vous pourriez vouloir l'utiliser est lorsque vous essayez d'accéder à une ressource qui pourrait nécessiter une nouvelle tentative, par ex.

do
{
   try to access resource...
   put up message box with retry option

} while (user says retry);

3 votes

Donc je suppose que ça fait partie de la catégorie "Je n'ai pas rencontré cette circonstance".

8 votes

Honnêtement, je me trouve très rarement dans une circonstance où j'ai juste besoin d'utiliser un do..while

1 votes

Peut-être un peu court, mais Bob a raison. Do/while doit être utilisé lorsque vous voulez exécuter le bloc de code. au moins une fois . Vous devez utiliser une boucle while lorsque vous ne savez pas si vous voulez l'exécuter une seule fois. Cela dit, je peux vous dire qu'avec environ 15 ans d'expérience en développement, j'ai utilisé beaucoup plus de boucles while que de boucles do/while.

69voto

Ben Voigt Points 151460

Do-while est meilleur si le compilateur n'est pas compétent en matière d'optimisation. do-while n'a qu'un seul saut conditionnel, contrairement à for et while qui ont un saut conditionnel et un saut inconditionnel. Pour les CPU qui sont pipelinés et ne font pas de prédiction de branchement, cela peut faire une grande différence dans les performances d'une boucle serrée.

De plus, comme la plupart des compilateurs sont suffisamment intelligents pour effectuer cette optimisation, toutes les boucles trouvées dans le code décompilé seront généralement des do-while (si le décompilateur se donne la peine de reconstruire les boucles à partir des gotos locaux en arrière).

6 votes

+1 pour ajouter des informations techniques pertinentes au choix entre les formes de boucle.

2 votes

Non seulement prématuré mais inutile. Si vous voulez vraiment une boucle while, c'est-à-dire la possibilité d'itérer 0 fois, vous devez enfermer la boucle dans un if, ce qui ramène le saut dans la boucle.

3 votes

@Jeremy : Le saut dont vous parlez est en dehors de la boucle, il n'est pas exécuté N fois.

12voto

Chandam Points 357

Je l'ai utilisé dans une fonction TryDeleteDirectory. C'était quelque chose comme ceci

do
{
    try
    {
        DisableReadOnly(directory);
        directory.Delete(true);
    }
    catch (Exception)
    {
        retryDeleteDirectoryCount++;
    }
} while (Directory.Exists(fullPath) && retryDeleteDirectoryCount < 4);

0 votes

Joli. C'est le premier exemple qui a vraiment du sens d'être enveloppé dans un do...while.

4 votes

Pourquoi/en quoi est-ce mieux qu'une norme while ?

0 votes

La boucle ne s'exécutera qu'une seule fois. Vous pouvez donc faire quelque chose, puis réessayer si cela échoue. Si vous utilisez une boucle while normale, vous devrez vérifier si elle échoue avant même de l'avoir exécutée à la première itération.

11voto

detly Points 11267

Il s'agit en quelque sorte d'une réponse indirecte, mais cette question m'a fait réfléchir à la logique qui la sous-tend, et j'ai pensé que cela valait la peine d'être partagé.

Comme tout le monde l'a dit, vous utilisez un do ... while lorsque vous voulez exécuter le corps au moins une fois. Mais dans quelles circonstances voudriez-vous faire cela ?

Eh bien, la catégorie la plus évidente de situations auxquelles je peux penser serait quand la valeur initiale ("non amorcée") de la condition de contrôle est la même que celle du moment où vous voulez sortir. . Cela signifie que vous devez exécuter le corps de la boucle une fois pour amorcer la condition à une valeur non-existante, puis effectuer la répétition réelle en fonction de cette condition. Les programmeurs étant si paresseux, quelqu'un a décidé d'emballer tout cela dans une structure de contrôle.

Ainsi, par exemple, la lecture de caractères à partir d'un port série avec un délai d'attente pourrait prendre la forme (en Python) :

response_buffer = []
char_read = port.read(1)

while char_read:
    response_buffer.append(char_read)
    char_read = port.read(1)

# When there's nothing to read after 1s, there is no more data

response = ''.join(response_buffer)

Notez la duplication du code : char_read = port.read(1) . Si Python avait un do ... while boucle, j'aurais pu utiliser :

do:
    char_read = port.read(1)
    response_buffer.append(char_read)
while char_read

L'avantage supplémentaire pour les langages qui créent une nouvelle portée pour les boucles : char_read ne pollue pas l'espace de noms des fonctions. Mais notez également qu'il existe une meilleure façon de procéder, à savoir l'utilisation de la fonction Python None valeur :

response_buffer = []
char_read = None

while char_read != '':
    char_read = port.read(1)
    response_buffer.append(char_read)

response = ''.join(response_buffer)

Voici donc l'essentiel de mon point de vue : dans les langages avec des types nuls, la situation est la suivante initial_value == exit_value se produit beaucoup moins fréquemment, et que peut être la raison pour laquelle vous ne le rencontrez pas. Je ne dis pas que cela n'arrive jamais, parce qu'il y a toujours des moments où une fonction retourne None pour signifier une condition valide. Mais, à mon avis, cela arriverait beaucoup plus souvent si les langages que vous utilisez ne permettaient pas d'avoir une valeur qui signifie : cette variable n'a pas encore été initialisée.

Ce n'est pas un raisonnement parfait : en réalité, maintenant que les valeurs nulles sont courantes, elles constituent simplement un élément supplémentaire de l'ensemble des valeurs valides que peut prendre une variable. Mais en pratique, les programmeurs ont un moyen de faire la distinction entre une variable se trouvant dans un état sensible, qui peut inclure l'état de sortie de boucle, et une variable se trouvant dans un état non initialisé.

0 votes

C'est l'une des réponses les plus intéressantes que j'ai lues ici. Belle contribution.

0 votes

Les deux versions ne sont pas équivalentes. Si la première lecture renvoie None le while version correcte n'ajoute rien au tampon de réponse, mais votre do version ajoute toujours quelque chose.

0 votes

@DavidStone read() ne devrait jamais revenir None . Si vous utilisez une bibliothèque où c'est le cas, la prémisse ne s'applique pas (c'est-à-dire que la valeur sentinelle ne fait pas partie de l'ensemble des valeurs de contrôle possibles).

11voto

La fonction "Do while" est utile lorsque vous souhaitez exécuter quelque chose au moins une fois. Pour donner un bon exemple de l'utilisation de do while par rapport à while, disons que vous voulez faire ce qui suit : Une calculatrice.

Pour ce faire, vous pouvez utiliser une boucle et vérifier après chaque calcul si la personne souhaite quitter le programme. Maintenant, vous pouvez probablement supposer qu'une fois que le programme est ouvert, la personne veut le faire au moins une fois, donc vous pourriez faire ce qui suit :

do
{
    //do calculator logic here
    //prompt user for continue here
} while(cont==true);//cont is short for continue

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X