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?
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 -
true
.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;
C'est la même chose que:
while(true) {
//Some Stuff
}
Fondamentalement, une syntaxe alternative pour une boucle infinie.
Ce sont toutes des boucles infinies
for(;;) {
// endlessly
}
while(true) {
// endlessly
}
do {
// endlessly
} while(true);
Cette boucle n'a pas de garde et agit comme une boucle while (true). Il bouclera indéfiniment jusqu'à une pause.
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.
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.