web-dev-qa-db-fra.com

Comment fonctionne une boucle for, en particulier pour (;;)?

En parcourant un ancien code d'entreprise, je suis tombé sur une boucle for qui ressemble à ceci:

for (;;) {
    //Some stuff
}

J'ai essayé Google, mais je n'ai trouvé aucune réponse. Je me suis endormi dans un cours de programmation ou est-ce une boucle inhabituelle?

61
Frank

Une boucle for dans Java a la structure suivante -

for (initialization statement; condition check; update)
    loop body;

Comme vous pouvez le voir, il y a quatre déclarations ici -

  1. Instruction d'initialisation: cette instruction n'est exécutée qu'une seule fois, lorsque la boucle est entrée pour la première fois. Il s'agit d'une instruction facultative, ce qui signifie que vous pouvez choisir de laisser ce champ vide. Il est généralement utilisé à des fins d'initialisation.
  2. Vérification conditionnelle: cette déclaration est probablement la plus importante. Il vérifie si certaines expressions ont la valeur true. Si c'est le cas, l'exécution de la boucle continue. Vous pouvez choisir de laisser ce champ vide, qui sera évalué à true.
  3. Mise à jour: cette liste d'instructions est exécutée de gauche à droite, généralement utilisée pour incrémenter/décrémenter une variable.
  4. corps de la boucle: le corps de la boucle, qui sera exécuté encore et encore en fonction de la valeur de vérité de la vérification conditionnelle.

Fondamentalement, c'est ainsi que l'exécution suit - tout d'abord, lorsque la boucle est entrée pour la première fois, l'instruction d'initialisation est exécutée une fois. Ensuite, la vérification conditionnelle est exécutée pour voir si elle a été évaluée comme vraie. Si c'est le cas, le corps de la boucle est exécuté, sinon l'exécution de la boucle est terminée. Après cela, la ou les instructions de mise à jour sont exécutées. Ensuite, la vérification conditionnelle est exécutée à nouveau, et si elle est évaluée à vrai, alors à nouveau le corps de la boucle est exécuté, puis l'instruction de mise à jour est exécutée, puis à nouveau la vérification conditionnelle .... vous obtenez l'image.

Maintenant sur votre syntaxe for( ; ; ). Il n'a aucune instruction d'initialisation, donc rien ne sera exécuté. Son instruction de vérification conditionnelle est également vide, ce qui signifie qu'elle prend la valeur true après l'exécution du corps de la boucle. Ensuite, puisque l'instruction de mise à jour est vide, rien n'est exécuté. Ensuite, la vérification conditionnelle est exécutée à nouveau, ce qui est à nouveau évalué comme vrai, puis l'ensemble de ce processus se répète.

Donc, vous voyez, il s'agit essentiellement d'une boucle infinie qui n'a pas d'instruction d'initialisation, dont la vérification conditionnelle sera toujours évaluée à true et qui n'a pas d'instruction de mise à jour. Cela équivaut à -

while(true)
{
    .....
}

qui est une autre construction de boucle populaire en Java.

Lorsque vous utilisez une boucle infinie comme celle-ci, il est important de faire attention à la condition de rupture car dans la plupart des cas, vous ne pouvez pas laisser une boucle fonctionner indéfiniment. Pour sortir de ces types de boucles, vous pouvez utiliser l'instruction break. La structure est la suivante -

if(some_condition_is_true)
    break;        // This will cause execution to break out of its nearest loop

ou

if(some_condition_is_false)
    break;
86
MD Sayem Ahmed

C'est la même chose que:

while(true) {
  //Some Stuff
}

Fondamentalement, une syntaxe alternative pour une boucle infinie.

38
Marcelo

Ce sont toutes des boucles infinies

for(;;) {
   // endlessly
}

while(true) {
   // endlessly
}

do {
   // endlessly
} while(true);
9
Peter Lawrey

Cette boucle n'a pas de garde et agit comme une boucle while (true). Il bouclera indéfiniment jusqu'à une pause.

6
Aram Kocharyan

C'est une boucle infinie. Ce n'est pas vraiment un bon codage car ce n'est pas intuitif, c'est-à-dire qu'il compilerait ou ne lancerait pas une erreur d'exécution. Réécrire en tant que while(true) { /* code */ } serait beaucoup plus lisible pour indiquer une boucle infinie.

3
Travis Nelson

C'est une boucle infinie. Les instructions d'initialisation, de condition et d'incrémentation sont toutes facultatives, donc sans aucune d'entre elles, cela sera toujours en boucle à nouveau (sauf si une rupture est frappée ou qu'une autre construction interagit avec elle).

Bien que je ne sois pas sûr de Java, cette question explique comment en .Net votre for et une while (true) vides seront compilés exactement pour la même chose. Je ne serais pas surpris si Java fait de même.

2
Corey Ogburn