83 votes

Une boucle "do {...} while ()" est-elle nécessaire?

Bjarne Stroustrup (C++ créateur) a dit une fois, qu'il évite de "faire/tout en boucles, et préfère écrire le code dans une boucle "while" à la place. [Voir la citation ci-dessous.]

Depuis entendant cela, j'ai trouvé ceci pour être vrai. Quelles sont vos pensées? Est-il un exemple où un "do-while" est beaucoup plus propre et plus facile à comprendre que si vous avez utilisé un "tout" à la place?

En réponse à certaines des réponses: oui, je comprends la différence technique entre "do-while" et "tout". C'est une question plus profonde à propos de la lisibilité et de la structuration du code impliquant des boucles.

Laissez-moi vous poser une autre façon: supposons que l'on vous interdit de "faire/tout en" - est-il réaliste d'un exemple où cela vous donnerait pas le choix mais pour écrire impur code à l'aide de "tout"?

De "Le Langage De Programmation C++", 6.3.3:

Dans mon expérience, la déclaration est une source d'erreurs et de confusion. La raison en est que son corps est toujours exécutée une fois avant que la condition est évaluée. Cependant, pour le corps à fonctionner correctement, quelque chose de très semblable à la condition doit tenir même la première fois. Plus souvent que je l'aurais deviné, j'ai constaté que la condition de ne pas tenir comme prévu, soit lorsque le programme a d'abord été écrit et testé, ou plus tard, après le code précédent, il a été modifié. Je préfère aussi la condition "à l'avant où je peux le voir." Par conséquent, j'ai tendance à éviter de faire les relevés. -Bjarne

103voto

David Božjak Points 4028

Oui, je suis d’accord pour dire que les boucles while peuvent être réécrites en boucle while, mais je ne suis pas d’accord pour dire qu’utiliser toujours une boucle while est préférable. faire tout en étant toujours exécuté au moins une fois et c'est une propriété très utile (l'exemple le plus typique étant la vérification d'entrée (à partir du clavier))

 #include <stdio.h>

int main() {
    char c;

    do {
        printf("enter a number");
        scanf("%c", &c);

    } while (c < '0' ||  c > '9'); 
}
 

Cela peut bien sûr être réécrit en boucle while, mais ceci est généralement considéré comme une solution beaucoup plus élégante.

38voto

sharptooth Points 93379

do-while est une boucle avec une post-condition. Vous en avez besoin dans les cas où le corps de la boucle est exécutée au moins une fois. Ceci est nécessaire pour que le code qui a besoin d'une action avant de la condition de la boucle peut être raisonnablement évalué. Avec boucle while vous devez appeler le code d'initialisation de deux sites, avec le faire-alors que vous ne pouvez l'appeler à partir d'un seul site.

Un autre exemple est lorsque vous avez déjà un objet valide lors de la première itération est commencé, de sorte que vous ne souhaitez pas exécuter quoi que ce soit (condition de boucle d'évaluation inclus) avant la première itération commence. Un exemple en est avec FindFirstFile/FindNextFile fonctions Win32: vous appelez FindFirstFile qui renvoie soit à une erreur ou à une recherche de la poignée pour le premier fichier, puis vous appelez FindNextFile jusqu'à ce qu'il renvoie une erreur.

Pseudo-code:

Handle handle;
Params params;
if( ( handle = FindFirstFile( params ) ) != Error ) {
   do {
      process( params ); //process found file
   } while( ( handle = FindNextFile( params ) ) != Error ) );
}

18voto

Dan Olson Points 11210

do { ... } while (0) est une notion importante pour faire des macros à bien se comporter.

Même si c'est sans importance dans le code réel (avec qui je ne suis pas forcément d'accord), il est important pour la fixation de certaines des lacunes du préprocesseur.

Edit: j'ai couru dans une situation où faire/tout était beaucoup plus propre aujourd'hui dans mon propre code. J'ai été faire une croix-plate-forme de l'abstraction de la paire LL/SC instructions. Ces le besoin d'être utilisée dans une boucle, comme ceci:

do
{
  oldvalue = LL (address);
  newvalue = oldvalue + 1;
} while (!SC (address, newvalue, oldvalue));

(Les Experts pourriez réaliser que oldvalue est pas utilisé dans un SC de mise en Œuvre, mais il est inclus afin que cette abstraction peut être émulée avec AR.)

LL et SC sont un excellent exemple d'une situation où do-while est nettement plus propre que l'équivalent, tandis que le formulaire:

oldvalue = LL (address);
newvalue = oldvalue + 1;
while (!SC (address, newvalue, oldvalue))
{
  oldvalue = LL (address);
  newvalue = oldvalue + 1;
}

Pour cette raison, je suis extrêmement déçu par le fait que les Go de Google a choisi de supprimer le faire-lors de la construction.

7voto

hasenj Points 36139

C'est utile lorsque vous voulez "faire" quelque chose "jusqu'à ce que" une condition soit remplie.

Il peut être falsifié dans une boucle while comme ceci:

 while(true)
{

    // .... code .....

    if(condition_satisfied) 
        break;
}
 

6voto

Suvesh Pratapa Points 3735

(En supposant que vous connaissez la différence entre les deux)

Do / While est utile pour initialiser / pré-initialiser le code avant que votre condition ne soit vérifiée et que la boucle while ne soit exécutée.

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