2012-04-11 11 views
0

Mögliche Duplizieren zu verwenden:
Is “for(;;)” faster than “while (TRUE)”? If not, why do people use it?Welche Endlosschleife wird bevorzugt

ich ein Programmier Buch gelesen (Java) gibt der Autor verwendet for(;;) statt while(true). Dieses Ding fängt wirklich an, mich zu ärgern, also dachte ich, dass ich überprüfen sollte, welches das beste ist und wenn es irgendwelche Unterschiede gibt. Hier sind die möglichen Endlosschleifen:

for(;;){ 

} 

while(true){ 

} 

do{ 

}while(true) 
  • Welche preferble zu bedienen?
  • Gibt es Unterschiede in der Präformanz (wie Sie testen müssen, wenn im Fall where true wahr ist) oder sind sie zu demselben Ding kompiliert?
+1

Meine Vermutung wäre, dass die meisten Programmierer die Absicht von 'while (true)' erkennen würden, ohne zweimal gucken zu müssen; Um das Prinzip der geringsten Verwirrung zu bewahren, würde ich das persönlich wählen. Letztendlich denke ich, dass es kaum mehr als eine Stilwahl ist. –

+1

Sie haben einen vergessen: start: int nop = 1 + 1; Start brechen; – Mikhail

+6

'#define ever ;;' 'für (immer)' – Femaref

Antwort

6

Sie sind zu der gleichen Sache zusammengestellt und sind nur eine Frage des Stils. Ältere Programmierer erkennen möglicherweise for(;;), aber ich würde wahrscheinlich nur while(true) verwenden.

+0

Es hat nichts mit älteren zu tun; Menschen wurden zwischen 'for (;;) und' while (1) 'seit dem Anbruch von C. aufgeteilt. – Kaz

+0

@Kaz:' while (1) 'ist nicht dasselbe wie' while (true) '- der erste funktioniert nicht für Java. –

+6

Das ist richtig, aber ich hoffe, Sie können verstehen, dass ich nicht geschrieben hätte "Menschen wurden zwischen" für (;;) "und" während (wahr) "seit dem Anbruch von C" geteilt. " – Kaz

1

Ja das ist nur eine Frage des Stils und ich bevorzuge while(true), da die Absicht sofort klar ist. for(;;) sagt mir einfach nichts.

+3

'while (wahr)' ist eine Art Unsinn. Es testet einen Zustand, der sich niemals ändern kann. Eine echte Endlosschleife hat keine Bedingung, und 'for (;;)' drückt das genau aus. – Kaz

+1

Holy Bike Schuppen Batman! Ich mag die Idee, eine Bedingung zu testen, die sich niemals ändern kann, weil sie garantiert unendlich ausgeführt wird. – Hiro2k

+0

Sie könnten den MIPS-Befehlssatz mögen. In MIPS gibt es ein Register R0, das schreibgeschützt ist und dauerhaft eine Null hält. Außerdem ist der unbedingte Verzweigungsbefehl B nur ein Makro für einen "BEQ R0, R0, ": Zweig, wenn das Nullregister gleich ist. – Kaz

1

Im Zweifelsfall messen.

Wenn nichts anderes, codieren Sie alle drei Versionen und schauen Sie sich die generierte Assembly für jede von ihnen an. Es sei denn, der Compiler ist sehr dumm, ich werde echtes Geld wetten es wird den gleichen Code für alle drei erzeugen.

EDIT

FWIW, erzeugt gcc den gleichen Code für alle drei (zumindest in den toten einfachen Fällen, die ich geschrieben habe). while(true) ist zur Kompilierzeit berechenbar; Es gibt keine brauchen, um einen Test durchzuführen, nur einen Sprung zurück zum Anfang der Schleife hartcodieren.

1

Sie sollten in Bezug auf die Leistung identisch sein, aber auch wenn dies nicht der Fall ist, spielt die Geschwindigkeit keine Rolle, ebenso wenig wie die Lesbarkeit. Die beste Methode ist diejenige, die von jedem, der den Code betrachtet, als Endlosschleife erkannt wird. Ich würde zu while (true) tendieren, da es der grundlegendste Fall ist, aber das hängt davon ab, wer sich den Code ansieht.

+0

Ich hoffe, Sie würden Geschwindigkeit nicht über Lesbarkeit auf sagen, d. H. Einen Encoder. – Morpfh

+0

"Encoder" ist ein breiter Begriff. Die Situationen, in denen die Leistung so kritisch ist, sind selten. –

Verwandte Themen