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.

7voto

T.E.D. Points 26829

Je les ai beaucoup utilisés quand j'étais à l'école, mais pas tellement depuis.

En théorie, ils sont utiles lorsque vous voulez que le corps de la boucle s'exécute une fois avant la vérification de la condition de sortie. Le problème est que dans les rares cas où je ne veux pas que la vérification soit faite en premier, typiquement je veux le contrôle de sortie au milieu du corps de la boucle plutôt qu'à la toute fin. Dans ce cas, je préfère utiliser la célèbre fonction for (;;) avec un if (condition) exit; quelque part dans le corps.

En fait, si je ne suis pas sûr de la condition de sortie de la boucle, je trouve parfois utile de commencer à écrire la boucle en tant que for (;;) {} avec une instruction de sortie si nécessaire, et ensuite, lorsque j'ai terminé, je peux voir s'il peut être "nettoyé" en déplaçant les initialisations, les conditions de sortie et/ou le code d'incrémentation à l'intérieur de la section for entre parenthèses.

6voto

spinon Points 6362

do while est si vous voulez exécuter le bloc de code au moins une fois. while d'autre part, ne s'exécutera pas toujours en fonction des critères spécifiés.

6voto

Edward Leno Points 3050

Une situation dans laquelle vous devez toujours exécuter un morceau de code une fois, et en fonction de son résultat, éventuellement plusieurs fois. La même chose peut être produite avec un while également.

rc = get_something();
while (rc == wrong_stuff)
{
    rc = get_something();
}

do
{
    rc = get_something();
}
while (rc == wrong_stuff);

5voto

Ioan Paul Pirau Points 1502

C'est aussi simple que cela :

Précondition et postcondition

  • while (cond) {...} - condition préalable, il n'exécute le code qu'après vérification.
  • do {...} while (cond) - postcondition, le code est exécuté au moins une fois.

Maintenant que vous connaissez le secret utilisez-les à bon escient :)

4voto

Brandon Horsley Points 4001

Je constate que cette question a reçu une réponse adéquate, mais j'aimerais ajouter ce scénario d'utilisation très spécifique. Vous pourriez commencer à utiliser do...while plus fréquemment.

do
{
   ...
} while (0)

est souvent utilisé pour les #définitions de plusieurs lignes. Par exemple :

#define compute_values     \
   area = pi * r * r;      \
   volume = area * h

Cela fonctionne bien pour :

r = 4;
h = 3;
compute_values;

-Mais il y a un piège pour.. :

if (shape == circle)  compute_values;

comme cela s'étend à :

if (shape == circle) area = pi *r * r;
volume = area * h;

Si vous l'enroulez dans une boucle do ... while(0), il s'étend correctement à un seul bloc :

if (shape == circle)
  do
  {
    area = pi * r * r;
    volume = area * h;
  } while (0);

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