68 votes

Java: pour (;;) vs while (true)

Quelle est la différence entre une boucle standard while(true) et for(;;) ?

Y at-il, ou les deux seront mappés vers le même bytecode après la compilation?

117voto

Óscar López Points 97105

Sémantiquement, ils sont tout à fait équivalents. C'est une question de goût, mais je pense que while(true) semble plus propre et plus facile à lire et à comprendre au premier coup d'œil. En Java, aucun d'entre eux provoque les avertissements du compilateur.

Au niveau du bytecode, il peut dépendre du compilateur et le niveau d'optimisations, mais en principe le code émis doit être le même.

EDIT:

Sur mon compilateur, en utilisant le Bytecode Contour plugin,le pseudo-code d' for(;;){} ressemble à ceci:

   L0
    LINENUMBER 6 L0
   FRAME SAME
    GOTO L0

Et le pseudo-code d' while(true){} ressemble à ceci:

   L0
    LINENUMBER 6 L0
   FRAME SAME
    GOTO L0

Donc oui, au moins pour moi, elles sont identiques.

28voto

4ndrew Points 3133

C'est à vous de choisir. Parce qu'ils sont égaux au compilateur.

 public class Test {
    public static void main(String[] args) {
        while (true) {
            System.out.println("Hi");
        }
    }
}

javac -g:none Test.java
rename Test.class Test1.class

public class Test {
    public static void main(String[] args) {
        for (;;) {
            System.out.println("Hi");
        }
    }
}

# javac -g:none Test.java
# mv Test.class Test2.class
# diff -s Test1.class Test2.class
Files Test1.class and Test2.class are identical
 

7voto

Martin Andersson Points 1869

Il compile vers le même code octet, et c'est une question de goût construire vous préférez.

J'ai lu beaucoup de code source à partir de l'Oracle distribué JDK, et je ne peux pas facilement me souviens que j'ai vu un while(true) énoncé dans leur code, mais j'ai vu tout un tas de for(;;) états dans leur code. Moi personnellement, je préfère for(;;) et mon raisonnement va un peu à ça:

Le tout en boucle "doit" exiger une expression booléenne, pas un booléen constante. while(true) est un peu comme if(true), qui je pense a été fait légal seulement pour le confort de la masse. Un vide while() ne compile pas. L'ajout de l' true y sent un peu comme le piratage informatique.

for(;;) sur l'autre main est un "vrai" en boucle, même si elle est vide. Aussi, il vous permet d'économiser un couple de touches! =) (non pas que cela importe)

Donc, et je sais que ça semble fou, mais bien while(true) se lit mieux en anglais, je pense que for(;;) mieux exprimer votre intention et est beaucoup plus proche du langage de programmation Java. Éternelles boucles doivent être évités, de toute façon. Quand j'ai lu for(;;), je me sens en sécurité en sachant le développeur de frein le chemin d'exécution de quelque part. Quand j'ai lu while(true), j'ai juste ne peut être que sûr plus. Mais bon, peut-être que c'est juste moi! Nous sommes tous libres de choisir notre propre saveur.

6voto

Peter Lawrey Points 229686

Sur Oracle Java 7, vous obtenez le même code octet. Vous ne pouvez pas savoir à partir du code d'octet qui était utilisé dans l'original. Le meilleur est une question de goût. J'utilise while(true)

3voto

DMCS Points 25136

Selon le compilateur, il devrait correspondre au même code d'octet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X