2012-01-16 12 views
52

Qual è la differenza tra un ciclo standard while(true) e for(;;)?Java: for (;;) vs. while (true)

Esiste uno o entrambi saranno associati allo stesso bytecode dopo la compilazione?

+3

Hai provato a compilarlo e a guardare il codice byte? –

+3

Niente: http://stackoverflow.com/search?q=for+while+true –

+0

possibile duplicato di [for (; true;) diverso da while (true)?] (Http://stackoverflow.com/questions/ 440694/fortrue-different-from-whiletrue) –

risposta

88

Semanticamente, sono completamente equivalenti. È una questione di gusti, ma penso che while(true) sembri più pulito, ed è più facile da leggere e capire a prima vista. In Java nessuno dei due causa avvisi del compilatore.

A livello di bytecode, potrebbe dipendere dal compilatore e dal livello di ottimizzazioni, ma in linea di principio il codice emesso dovrebbe essere lo stesso.

EDIT:

Sul mio compilatore, utilizzando il plugin Bytecode Outline, il bytecode per for(;;){} assomiglia a questo:

L0 
    LINENUMBER 6 L0 
    FRAME SAME 
    GOTO L0 

E il bytecode while(true){} assomiglia a questo:

L0 
    LINENUMBER 6 L0 
    FRAME SAME 
    GOTO L0 

Quindi sì, almeno per me, sono identici.

+5

Accettata questa risposta per aver fornito il codice e come è stato consultato. Grazie. :) – sjas

+1

per (;;) è la versione più pulita, imo (anche più breve: P) – bestsss

+1

Si noti che in VS while (true) causa avvisi di compilazione sulle impostazioni più alte per C e C++ (C#?). Forse non è un problema per Java, ma se scrivi qualche volta in altre lingue, 'for (;;)' è un'abitudine migliore da sviluppare. –

3

A seconda del compilatore, deve mappare lo stesso codice byte.

2

JVM troverà il modo migliore per creare bytecode e in entrambi i casi dovrebbe fare lo stesso. Quindi penso che non ci siano differenze. mentre (vero) è solo più carino.

2

Funzionalmente non c'è differenza. Qualsiasi efficienza ottenuta o persa da una differenza nel bytecode sarà probabilmente insignificante rispetto a qualsiasi istruzione che si eseguirà nel corpo del ciclo.

5

Su Oracle Java 7 si ottiene lo stesso codice byte. Non si può sapere dal codice byte che stava usando nell'originale. La cosa migliore è una questione di gusti. Io uso while(true)

20

Spetta a te quale utilizzare. Perché sono uguali al compilatore.

creare il file:

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

di compilazione:

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

creare il file:

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

di compilazione:

javac -g:none Test.java 
mv Test.class Test2.class 

confrontare:

diff -s Test1.class Test2.class 
Files Test1.class and Test2.class are identical 
+4

upvote per il metodo utilizzato. – sjas

+0

Ho fatto un piccolo test. Decompilare le classi in jd-gui mostra 'for (;;)' e NOT 'whilte (true)' per entrambe le classi! – vedi0boy

+0

@ vedi0boy a livello JVM (e bytecode) - non c'è differenza, jd-gui seleziona il modo più semplice per mostrare questo ciclo. – 4ndrew

2

Ho guardato il bytecode generato e ha scoperto che dal momento che la condizione è sempre vero (al momento della compilazione), il compilatore compilare via il ramo di test e solo sempre alla parte superiore del ciclo. Suppongo che una dichiarazione continua faccia anche un ramo sempre in cima al ciclo.Quindi, non solo non fa alcuna differenza, non c'è nemmeno alcun codice generato per testare nulla.

3

Compilare lo stesso codice byte ed è una questione di gusti che si preferisce.

Ho letto un sacco di codice sorgente dal Oracle JDK distribuito, e non riesco a ricordare facilmente che ho visto una dichiarazione while(true) nel loro codice, ma ho visto un sacco di for(;;) dichiarazioni nel loro codice. Personalmente, preferisco lo for(;;) e il mio ragionamento va un po 'così:

Il ciclo while "dovrebbe" richiedere un'espressione booleana, non una costante booleana. while(true) è un po 'come if(true), entrambi i quali penso sia stato reso legale solo per il maggiore comfort delle masse. Un vuoto while() non viene compilato. Aggiungendo il true ci si sente un po 'come l'hacking.

for(;;) d'altra parte è un "loop reale", anche se vuoto. Inoltre, ti risparmia un paio di sequenze di tasti! =) (non che importa)

Pertanto, e so che sembra pazzesco, ma anche se while (true) legge meglio in inglese, credo che per (;;) meglio esprimere il vostro intento ed è più simile a il linguaggio di programmazione Java. I loop eterni dovrebbero essere comunque evitati. Quando leggo per (;;), mi sento sicuro sapendo che lo sviluppatore frenerà il percorso di esecuzione da qualche parte. Quando leggo mentre (vero), non posso più essere così sicuro. Ma hey, forse sono solo io! Siamo tutti liberi di scegliere il nostro sapore.

+0

Di quanto potresti scrivere mentre (1 == 1), che è, secondo me, il modo più pulito. – JacksOnF1re

Problemi correlati