2012-01-16 8 views
52

¿Cuál es la diferencia entre un ciclo while(true) estándar y for(;;)?Java: para (;;) frente a while (verdadero)

¿Hay alguno, o ambos se asignarán al mismo bytecode después de la compilación?

+3

¿Ha intentado compilarlo y mirar el código de bytes? –

+3

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

+0

posible duplicado de [for (; true;) diferente de while (true)?] (Http://stackoverflow.com/questions/ 440694/fortrue-different-from-whiletrue) –

Respuesta

88

Semánticamente, son completamente equivalentes. Es una cuestión de gusto, pero creo que while(true) se ve más limpio, y es más fácil de leer y entender a primera vista. En Java, ninguno de ellos causa advertencias al compilador.

En el nivel de bytecode, podría depender del compilador y del nivel de optimizaciones, pero en principio el código emitido debería ser el mismo.

EDIT:

En mi compilador, usando el plugin Bytecode Outline, el código de bytes de for(;;){} se parece a esto:

L0 
    LINENUMBER 6 L0 
    FRAME SAME 
    GOTO L0 

Y el código de bytes de while(true){} se ve así:

L0 
    LINENUMBER 6 L0 
    FRAME SAME 
    GOTO L0 

Así que sí, al menos para mí, son idénticos.

+5

Se aceptó esta respuesta por haber proporcionado el código y cómo se buscó. Gracias. :) – sjas

+1

para (;;) es la versión más limpia, imo (también más corto: P) – bestsss

+1

Tenga en cuenta que en VS while (true) provoca advertencias de compilación en las configuraciones más altas para C y C++ (C#?). Tal vez no sea un problema para Java, pero si escribe a veces en otros idiomas, 'for (;;)' es un mejor hábito para desarrollar. –

3

Según el compilador, debe correlacionarse con el mismo código de bytes.

2

JVM encontrará la mejor manera de crear bytecode y en ambos casos debería hacer lo mismo. Por lo tanto, creo que no hay diferencia. mientras que (verdadero) es simplemente más bonito.

2

Funcionalmente no hay diferencia. Cualquier eficiencia ganada o perdida por una diferencia en bytecode probablemente será insignificante en comparación con cualquier instrucción que ejecute en el cuerpo del bucle.

5

En Oracle Java 7 obtiene el mismo código de bytes. No se puede decir por el código de bytes que estaba usando en el original. Lo mejor es una cuestión de gusto. Yo uso while(true)

20

Depende de usted cuál usar. Porque son iguales al compilador.

crear el archivo:

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

de compilación:

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

crear el archivo:

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

de compilación:

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

comparar:

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

upvote para el método que se está utilizando. – sjas

+0

Hice una pequeña prueba. ¡Descompilar las clases en jd-gui muestra 'for (;;)' y NOT 'whilte (true)' para ambas clases! – vedi0boy

+0

@ vedi0boy en nivel JVM (y bytecode) - no hay diferencia, jd-gui selecciona la forma más fácil de mostrar este ciclo. – 4ndrew

2

he mirado el código de bytes generada y se encontró que, dado que la condición es siempre cierto (en tiempo de compilación), el compilador compilar distancia de la prueba y solo rama siempre de nuevo a la parte superior del ciclo. Supongo que una declaración continue también hará una bifurcación que siempre volverá a la parte superior del bucle.Por lo tanto, no solo no hace ninguna diferencia, ni siquiera se genera ningún código para probar nada.

3

Se compila con el mismo código de byte, y es una cuestión de gustos la construcción que prefiera.

He leído una gran cantidad de código fuente del JDK distribuido de Oracle, y no puedo recordar fácilmente que he visto una declaración while(true) en su código, pero he visto un montón de for(;;) declaraciones en su código. Personalmente, estoy a favor del for(;;) y mi razonamiento es un poco así:

El ciclo while "debería" requerir una expresión booleana, no una constante booleana. while(true) es un poco como if(true), ambos de los cuales creo que se han hecho legales solo para la mayor comodidad de las masas. Un while() vacío no se compila. Agregar el true adentro se siente como piratear.

for(;;) por el contrario es un "bucle real", aunque vacío. ¡Además, le ahorra un par de teclas! =) (no importa que)

Por lo tanto, y sé que suena loco, pero a pesar de while (true) se lee mejor en Inglés, creo que para (;;) expresar mejor su intención y se asemeja más a el lenguaje de programación Java. Los bucles eternos deben evitarse de todos modos. Cuando leo por (;;), me siento seguro sabiendo que el desarrollador frenará el camino de la ejecución en algún lugar. Cuando leo mientras (verdadero), ya no puedo estar tan seguro. Pero hey, tal vez sea solo yo! Todos somos libres de elegir nuestro propio sabor.

+0

De lo que podrías escribir mientras (1 == 1), que es, en mi opinión, la forma más limpia. – JacksOnF1re

Cuestiones relacionadas