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?
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?
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.
Accettata questa risposta per aver fornito il codice e come è stato consultato. Grazie. :) – sjas
per (;;) è la versione più pulita, imo (anche più breve: P) – bestsss
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. –
A seconda del compilatore, deve mappare lo stesso codice byte.
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.
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.
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)
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
upvote per il metodo utilizzato. – sjas
Ho fatto un piccolo test. Decompilare le classi in jd-gui mostra 'for (;;)' e NOT 'whilte (true)' per entrambe le classi! – vedi0boy
@ vedi0boy a livello JVM (e bytecode) - non c'è differenza, jd-gui seleziona il modo più semplice per mostrare questo ciclo. – 4ndrew
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.
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.
Di quanto potresti scrivere mentre (1 == 1), che è, secondo me, il modo più pulito. – JacksOnF1re
Hai provato a compilarlo e a guardare il codice byte? –
Niente: http://stackoverflow.com/search?q=for+while+true –
possibile duplicato di [for (; true;) diverso da while (true)?] (Http://stackoverflow.com/questions/ 440694/fortrue-different-from-whiletrue) –