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?
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?
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.
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
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.
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.