Que signifie “pour (;;)”?

En C / C ++, que signifie ce qui suit?

for(;;){ ... } 

C’est une boucle infinie, équivalente à while(true) . Lorsqu’aucune condition de terminaison n’est fournie, la condition par défaut est true .

Boucle jusqu’à ce qu’une déclaration break , exit , throw etc. à l’intérieur de la boucle s’exécute. Fondamentalement, vous pouvez imaginer une boucle for composée de:

 for (setup; test; advance) ... 

Si le “test” est vide, il est considéré comme true et la boucle continue à s’exécuter. Vide “setup” et “advance” ne font simplement rien.

En C et C ++ (et quelques autres langages également), la boucle for a trois sections:

  • une section de pré-boucle, qui s’exécute avant le début de la boucle;
  • une section de condition d’itération qui, bien que vraie, exécutera le corps de la boucle; et
  • une section de post-itération qui est exécutée après chaque itération du corps de la boucle.

Par exemple:

 for (i = 1, accum = 0; i <= 10; i++) accum += i; 

additionnerons les nombres de 1 à 10 inclus.

C'est à peu près équivalent à ce qui suit:

 i = 1; accum = 0; while (i <= 10) { accum += i; i++; } 

Toutefois, rien ne nécessite que les sections d'une instruction for contiennent réellement quoi que ce soit et, si la condition d'itération est manquante, elle est supposée être vraie.

Donc, la boucle for(;;) signifie simplement:

  • ne faites aucune configuration de boucle;
  • boucle pour toujours (pauses, retours et non des autres); et
  • ne faites aucun traitement post-itération.

En d'autres termes, c'est une boucle infinie.

Boucle infinie qui continue jusqu’à ce qu’il y ait une instruction break (), exit () ou goto.

Même si cette réponse suggère que les deux constructions sont équivalentes, il existe une différence subtile entre les deux for(;;) et while(1) (qui créent toutes deux des boucles infinies) dans le langage C (et éventuellement dépendant du compilateur).

Certains compilateurs (Windriver DIABData par exemple) se plaignent de “la condition est toujours vraie” lors de l’utilisation de while(1) .

Passer à for(;;) permet de se débarrasser de l’avertissement, probablement parce que cette dernière expression est sémantiquement plus forte pour créer une boucle infinie à dessein, et qu’il n’existe pas de condition “toujours vraie” (elle est plus courte à écrire).