Il est vrai que do
/ while
Les boucles sont plutôt rares. Je pense que c'est parce qu'un grand nombre de boucles sont de la forme
while(something needs doing)
do it;
En général, il s'agit d'un excellent modèle, et il possède la propriété généralement souhaitable que si rien ne doit être fait, la boucle s'exécute zéro fois.
Mais de temps en temps, il y a une bonne raison pour laquelle vous voulez absolument faire au moins un tour dans la boucle, quoi qu'il arrive. Mon exemple préféré est le suivant : convertir un nombre entier en sa représentation décimale sous forme de chaîne de caractères, c'est-à-dire en mettant en œuvre la fonction printf("%d")
ou le semi-standard itoa()
fonction.
À titre d'illustration, voici une mise en œuvre relativement simple de la fonction itoa()
. Ce n'est pas tout à fait la formulation "traditionnelle" ; je l'expliquerai plus en détail ci-dessous si vous êtes curieux. Mais l'essentiel est qu'il s'agit de l'algorithme canonique, qui consiste à diviser par 10 de manière répétée pour sélectionner les chiffres de droite, et qu'il est écrit à l'aide d'un programme ordinaire de type while
boucle... et cela signifie qu'il a un bug.
#include <stddef.h>
char *itoa(unsigned int n, char buf[], int bufsize)
{
if(bufsize < 2) return NULL;
char *p = &buf[bufsize];
*--p = '\0';
while(n > 0) {
if(p == buf) return NULL;
*--p = n % 10 + '0';
n /= 10;
}
return p;
}
Si vous ne l'avez pas remarqué, le bug est que ce code ne retourne rien - une chaîne vide - si vous lui demandez de convertir l'entier 0
. C'est donc un exemple de cas où, quand il n'y a "rien" à faire, on Ne le fais pas. Nous ne voulons pas que le code ne fasse rien - nous voulons toujours qu'il produise au moins un chiffre. Nous voulons donc toujours qu'il fasse au moins un tour de boucle. Ainsi, un do
/ while
La boucle est juste le ticket :
do {
if(p == buf) return NULL;
*--p = n % 10 + '0';
n /= 10;
} while(n > 0);
Donc maintenant nous avons une boucle qui généralement s'arrête lorsque n
atteint 0, mais si n
est initialement 0 - si vous passez dans un 0 - il retourne la chaîne de caractères "0"
selon les besoins.
Comme promis, voici un peu plus d'informations sur l'initiative de l'UE. itoa
dans cet exemple. Vous lui passez des arguments qui sont : un int
à convertir (en fait, un unsigned int
afin que nous n'ayons pas à nous soucier des nombres négatifs) ; un tampon dans lequel effectuer le rendu ; et la taille de ce tampon. Elle renvoie un char *
pointant dans votre tampon, pointant au début de la chaîne rendue. (Ou il renvoie NULL
s'il découvre que le tampon que vous lui avez donné n'était pas assez grand). L'aspect "non traditionnel" de cette implémentation est qu'elle remplit le tableau de droite à gauche, ce qui signifie qu'elle n'a pas besoin d'inverser la chaîne de caractères à la fin - et ce qui signifie également que le pointeur qu'elle vous renvoie est en général pas au début du tampon. Vous devez donc utiliser le pointeur qu'il vous renvoie comme chaîne de caractères à utiliser ; vous ne pouvez pas l'appeler et supposer ensuite que le tampon que vous lui avez remis est la chaîne de caractères que vous pouvez utiliser.
Enfin, pour être complet, voici un petit programme de test pour tester cette version de itoa
avec.
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int n;
if(argc > 1)
n = atoi(argv[1]);
else {
printf("enter a number: "); fflush(stdout);
if(scanf("%d", &n) != 1) return EXIT_FAILURE;
}
if(n < 0) {
fprintf(stderr, "sorry, can't do negative numbers yet\n");
return EXIT_FAILURE;
}
char buf[20];
printf("converted: %s\n", itoa(n, buf, sizeof(buf)));
return EXIT_SUCCESS;
}
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) ?