Problema interessante Na verdade, em ambos os casos, o loop não é infinito
Mas a principal diferença entre eles é quando terminará e quanto tempo x
levará para exceder o int
valor máximo que é2,147,483,647
depois disso atingirá o estado de estouro e o loop terminará.
A melhor maneira de entender esse problema é testar um exemplo simples e preservar seus resultados.
Exemplo :
for(int i = 10; i > 0; i++) {}
System.out.println("finished!");
Resultado:
finished!
BUILD SUCCESSFUL (total time: 0 seconds)
Depois de testar este loop infinito, levará menos de 1 segundo para terminar.
for(int i = 10; i > 0; i++) {
System.out.println("infinite: " + i);
}
System.out.println("finished!");
Resultado:
infinite: 314572809
infinite: 314572810
infinite: 314572811
.
.
.
infinite: 2147483644
infinite: 2147483645
infinite: 2147483646
infinite: 2147483647
finished!
BUILD SUCCESSFUL (total time: 486 minutes 25 seconds)
Neste caso de teste, você notará uma grande diferença no tempo necessário para encerrar e concluir a execução do programa.
Se você não tiver paciência, pensará que esse loop é interminável e não terminará, mas na verdade levará horas para terminar e atingir o estado de estouro no i
valor.
Finalmente concluímos, depois de colocar a instrução print dentro do loop for, que levará muito mais tempo do que o loop no primeiro caso sem a instrução print.
O tempo necessário para executar o programa depende das especificações do seu computador, em particular da capacidade de processamento (capacidade do processador), do sistema operacional e do IDE que está compilando o programa.
Eu testo este caso em:
Lenovo 2.7 GHz Intel Core i5
SO: Windows 8.1 64x
IDE: NetBeans 8.2
Demora cerca de 8 horas (486 minutos) para terminar o programa.
Além disso, você pode notar que o incremento de passo no loop for i = i + 1
for é um fator muito lento para atingir o valor máximo int.
Podemos alterar esse fator e tornar o incremento de etapa mais rápido para testar o loop em menos tempo.
se colocarmos i = i * 10
e testarmos:
for(int i = 10; i > 0; i*=10) {
System.out.println("infinite: " + i);
}
System.out.println("finished!");
Resultado:
infinite: 100000
infinite: 1000000
infinite: 10000000
infinite: 100000000
infinite: 1000000000
infinite: 1410065408
infinite: 1215752192
finished!
BUILD SUCCESSFUL (total time: 0 seconds)
Como você pode ver, é muito rápido em comparação com o loop anterior
leva menos de 1 segundo para encerrar e concluir a execução do programa.
Após este exemplo de teste, acho que deve esclarecer o problema e provar a validade de Zbynek Vyskovsky - a resposta do kvr000 , também será a resposta a esta pergunta .
x
cresce mais rápido do que a variável do loopj
. Em outras palavras,j
nunca atingirá um limite superior, portanto, o loop será executado "para sempre". Bem, não para sempre, você provavelmente terá um estouro em algum ponto.