Je suppose que vous en fait avait int status
à l'extérieur de du corps de la boucle, sinon le code ne serait pas compiler. (Même pas avec le site do
en place).
Cela étant corrigé, le code que vous avez écrit est toujours valable sans do
mais fait quelque chose de différent, comme vous l'avez déjà noté correctement. Permettez-moi de le réécrire légèrement pour montrer comment il est interprété :
int main () {
int status;
{ // anonymous braced block that just creates a new scope
status = foo();
}
while (status) {
// empty loop body
}
}
Un bloc autonome comme celui-là a son utilité par exemple pour utiliser RAII - il pourrait contenir une variable locale avec un objet dont le destructeur libère une ressource lorsqu'il sort de son champ d'application (par exemple un handle de fichier), entre autres choses.
La raison pour laquelle le while (status);
est la même chose que while (status) {}
c'est parce que vous êtes autorisé à mettre soit une seule déclaration soit un bloc, et que ;
est une déclaration valide qui ne fait rien.
Et écrire quelque chose comme <code>while (someVariable);</code> n'est même pas absurde en général (bien qu'elle le soit dans ce cas) car il s'agit essentiellement d'un spinlock, une forme d'attente occupée - il quitterait la boucle si un autre cœur de processeur, un composant d'E/S ou une interruption modifiait la valeur de <code>someVariable</code> afin que la condition ne soit plus remplie, et elle le ferait sans délai. Vous n'écririez probablement pas un tel code sur une plate-forme de bureau où "monopoliser le CPU" est une mauvaise chose (sauf dans des scénarios spécifiques dans le code en mode noyau), mais sur un dispositif intégré comme un microcontrôleur (où votre code est le seul code qui s'exécute), cela peut être une façon parfaitement valide d'implémenter un code qui attend un changement externe. Comme l'a souligné Acorn dans les commentaires, cela n'aurait bien sûr de sens que si <code>someVariable</code> étaient <code>volatile</code> (ou autrement non prévisible), mais je parle des boucles occupées sur une variable en général.