Java: für (;;) vs. while (wahr)
Was ist der Unterschied zwischen einem standard - while(true)
Schleife und for(;;)
?
Gibt es eine, oder beide zugeordnet werden, um den gleichen bytecode nach dem kompilieren?
Kommentar zu dem Problem
Haben Sie versucht, kompilieren und nach der byte-code?
mögliche Duplikate von for(;true;) while(true)?
Siehe auch: Ist "for(;;)" schneller als "while (TRUE)"? Wenn nicht, warum machen die Leute es verwenden? Es ist für C, aber die Antworten, die meist immer noch Anwendung.
InformationsquelleAutor der Frage sjas | 2012-01-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Semantisch, Sie sind völlig gleichwertig. Es ist eine Frage des Geschmacks, aber ich denke
while(true)
sieht sauberer aus und ist leichter zu Lesen und zu verstehen, auf den ersten Blick. In Java-weder von Ihnen verursacht eine compiler-Warnung.Auf der bytecode-Ebene könnte es hängt vom compiler und das Niveau der Optimierungen, aber im Prinzip ist der code emittiert die gleiche sein sollte.
EDIT:
Auf meinem compiler, mit dem Bytecode Umriss plugin,die bytecode für die
for(;;){}
sieht wie folgt aus:Und der bytecode für
while(true){}
sieht wie folgt aus:Also ja, zumindest für mich, dass Sie identisch sind.
InformationsquelleAutor der Antwort Óscar López
Es ist bis zu Ihnen, welche Sie verwenden möchten. Verursachen Sie gleich-compiler.
Datei erstellen:
kompilieren:
Datei erstellen:
kompilieren:
vergleichen:
InformationsquelleAutor der Antwort 4ndrew
Auf Oracle Java 7 erhalten Sie die gleichen byte-code. Man kann nicht sagen, aus den byte-code, die war mit im original. Welches am besten ist, ist Geschmackssache. Ich benutze
while(true)
InformationsquelleAutor der Antwort Peter Lawrey
Je nach compiler, es sollte die map den gleichen byte-code.
InformationsquelleAutor der Antwort DMCS
Kompiliert bis hin zu den gleichen byte-code, und es ist eine Frage des Geschmacks, welche zu konstruieren, die Sie bevorzugen.
Las ich eine Menge von source-code aus dem Oracle-verteilte JDK, und ich kann nicht einfach daran erinnern, dass ich gesehen habe
while(true)
- Anweisung in Ihrem code, aber ich habe gesehen, eine ganze Mengefor(;;)
Anweisungen in Ihrem code. Mich persönlich, ich bevorzugefor(;;)
und meine Argumentation geht ein bisschen wie diese:Die while-Schleife, "sollte" verlangen einen booleschen Ausdruck, nicht eine boolsche Konstante.
while(true)
ist ein bisschen wieif(true)
, beide von denen ich denke, dass wurde aus rechtlichen nur für den zusätzlichen Komfort der Massen. Eine leerewhile()
nicht kompilieren. Hinzufügen dertrue
dort fühlt sich ein bisschen wie hacking.for(;;)
auf der anderen Seite ist eine "echte " loop", wenn auch ein leerer. Auch spart Sie ein paar Tastenanschläge! =) (nicht, dass es egal)Daher, und ich weiß, es klingt verrückt, aber obwohl while(true) liest sich besser in Englisch, ich denke, für(;;) besser äußern Sie Ihre Absicht, und ist eher an der Programmiersprache Java. Ewige Schleifen sollten vermieden werden sowieso. Wenn ich Lesen for(;;), ich fühle mich sicher zu wissen, die Entwickler Bremsen die Ausführung von Pfad irgendwo. Wenn ich Lesen while(true), ich kann einfach nicht sein, dass Sie sicher nicht mehr. Aber hey, vielleicht ist das nur mir! Wir sind alle frei zu wählen, unsere eigenen Geschmack.
InformationsquelleAutor der Antwort Martin Andersson
JVM finden der beste Weg, um bytecode und in beiden Fällen sollte das gleiche tun.Also ich denke, es gibt keinen Unterschied. while(true) ist einfach schöner.
InformationsquelleAutor der Antwort shift66
Funktional gibt es keinen Unterschied. Effizienz gewonnen oder verloren, der einen Unterschied im bytecode wird wahrscheinlich gering sein im Vergleich zu einer Anweisung führen Sie in den Körper der Schleife.
InformationsquelleAutor der Antwort Dev
Ich habe mir den generierten byte-code und festgestellt, dass da die Bedingung immer wahr (zur compile-Zeit), der compiler kompiliert Weg die test-und gerade-Zweig immer wieder an den Anfang der Schleife. Ich gehe davon aus, dass ein weiter - Anweisung wird auch ein Zweig immer wieder an den Anfang der Schleife. Also, nicht nur, dass es keinen Unterschied machen, gibt es nicht auch irgendwelche generierten code zu testen, nichts.
InformationsquelleAutor der Antwort Bruce Barton