C'est mon opinion personnelle, mais cette question appelle une réponse fondée sur l'expérience :
-
Je programme en C depuis 38 ans, et je n'utilise jamais do
/ while
les boucles dans le code ordinaire.
-
La seule utilisation convaincante de cette construction est dans les macros, où elle permet de regrouper plusieurs instructions en une seule via une balise do { multiple statements } while (0)
-
J'ai vu d'innombrables exemples de do
/ while
des boucles avec une détection d'erreur bidon ou des appels de fonction redondants.
-
Mon explication pour cette observation est que les programmeurs ont tendance à modéliser les problèmes de manière incorrecte lorsqu'ils pensent en termes de do
/ while
boucles. Soit ils manquent une condition finale importante, soit ils manquent l'échec possible de la condition initiale qu'ils déplacent à la fin.
Pour ces raisons, j'en suis venu à croire que où il y a un do
/ while
boucle, il y a un bug et je mets régulièrement au défi les programmeurs débutants de me montrer une do
/ while
boucle où je ne peux pas repérer un bug à proximité.
Ce type de boucle peut être facilement évité : utilisez un fichier de type for (;;) { ... }
et ajouter les tests de terminaison nécessaires lorsqu'ils sont appropriés. Il n'est pas rare qu'il faille ajouter plus d'un test de ce type.
Voici un exemple classique :
/* skip the line */
do {
c = getc(fp);
} while (c != '\n');
Cette opération échouera si le fichier ne se termine pas par une nouvelle ligne. Un exemple trivial d'un tel fichier est le fichier vide.
Une meilleure version est la suivante :
int c; // another classic bug is to define c as char.
while ((c = getc(fp)) != EOF && c != '\n')
continue;
Alternativement, cette version cache également le c
variable :
for (;;) {
int c = getc(fp);
if (c == EOF || c == '\n')
break;
}
Essayez de chercher while (c != '\n');
dans n'importe quel moteur de recherche, et vous trouverez des bugs tels que celui-ci (consulté le 24 juin 2017) :
Sur ftp://ftp.dante.de/tex-archive/biblio/tib/src/streams.c fonction getword(stream,p,ignore)
, a un do
/ while
et bien sûr, au moins deux bogues :
-
c
est défini comme un char
y
- il existe une boucle infinie potentielle
while (c!='\n') c=getc(stream);
Conclusion : éviter do
/ while
des boucles et cherchez les insectes quand vous en voyez un.
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.
0 votes
MANY duplicata. En voici un qui renvoie à plusieurs d'entre eux : stackoverflow.com/questions/3094972/
0 votes
Python n'a même pas de boucles Do While. La plupart des fois où vous en aurez besoin, vous pourrez trouver une autre façon de résoudre le problème.
0 votes
@DuplicateWhistleBlowers - Je vous promets que j'ai essayé de rechercher ceci sur stack overflow (même mon titre n'a pas donné de résultats similaires). Je pense que c'était à cause de mon utilisation de "do...while" ? Désolé pour le double affichage.
3 votes
La bonne "question principale" semble être stackoverflow.com/questions/224059/
0 votes
Puisque les deux cibles de dupe ont été fusionnées dans une question subjective qui a été fermée pour avoir demandé une discussion, réouverture.
0 votes
Duplicata possible de Tester les boucles en haut ou en bas (while vs. do while) ?