Problema interesante En realidad, en ambos casos, el bucle no es interminable
Pero la principal diferencia entre ellos es cuándo terminará y cuánto tiempo x
llevará exceder el int
valor máximo , que es 2,147,483,647
después de que alcanzará el estado de desbordamiento y el ciclo terminará.
La mejor manera de comprender este problema es probar un ejemplo simple y conservar sus resultados.
Ejemplo :
for(int i = 10; i > 0; i++) {}
System.out.println("finished!");
Salida:
finished!
BUILD SUCCESSFUL (total time: 0 seconds)
Después de probar este bucle infinito, tardará menos de 1 segundo en terminar.
for(int i = 10; i > 0; i++) {
System.out.println("infinite: " + i);
}
System.out.println("finished!");
Salida:
infinite: 314572809
infinite: 314572810
infinite: 314572811
.
.
.
infinite: 2147483644
infinite: 2147483645
infinite: 2147483646
infinite: 2147483647
finished!
BUILD SUCCESSFUL (total time: 486 minutes 25 seconds)
En este caso de prueba, notará una gran diferencia en el tiempo necesario para finalizar y finalizar la ejecución del programa.
Si no tiene paciencia, pensará que este ciclo es interminable y no terminará, pero de hecho tomará horas terminar y alcanzar el estado de desbordamiento en el i
valor.
Finalmente, concluimos, después de poner la declaración de impresión dentro del bucle for, que tomará mucho más tiempo que el bucle en el primer caso sin la declaración de impresión.
El tiempo necesario para ejecutar el programa depende de las especificaciones de su computadora, en particular la potencia de procesamiento (capacidad del procesador), el sistema operativo y su IDE que está compilando el programa.
Pruebo este caso en:
Lenovo Intel Core i5 de 2,7 GHz
SO: Windows 8.1 64x
IDE: NetBeans 8.2
Se tarda unas 8 horas (486 minutos) en finalizar el programa.
También puede notar que el incremento de paso en el ciclo for i = i + 1
es un factor muy lento para alcanzar el valor máximo de int.
Podemos cambiar este factor y hacer que el incremento de pasos sea más rápido para probar el bucle en menos tiempo.
si lo ponemos i = i * 10
y lo probamos:
for(int i = 10; i > 0; i*=10) {
System.out.println("infinite: " + i);
}
System.out.println("finished!");
Salida:
infinite: 100000
infinite: 1000000
infinite: 10000000
infinite: 100000000
infinite: 1000000000
infinite: 1410065408
infinite: 1215752192
finished!
BUILD SUCCESSFUL (total time: 0 seconds)
Como ves, es muy rápido en comparación con el ciclo anterior.
toma menos de 1 segundo terminar y terminar de ejecutar el programa.
Después de este ejemplo de prueba, creo que debería aclarar el problema y probar la validez de Zbynek Vyskovsky: la respuesta de kvr000 , también será la respuesta a esta pregunta .
x
crece más rápido que la variable del cicloj
. En otras palabras,j
nunca alcanzará un límite superior, por lo tanto, el ciclo se ejecutará "para siempre". Bueno, no para siempre, lo más probable es que se desborde en algún momento.