Problema interessante In realtà in entrambi i casi il ciclo non è infinito
Ma la differenza principale tra loro è quando terminerà e quanto tempo x
impiegherà per superare il int
valore massimo , 2,147,483,647
dopodiché raggiungerà lo stato di overflow e il ciclo terminerà.
Il modo migliore per comprendere questo problema è provare un semplice esempio e preservarne i risultati.
Esempio :
for(int i = 10; i > 0; i++) {}
System.out.println("finished!");
Produzione:
finished!
BUILD SUCCESSFUL (total time: 0 seconds)
Dopo aver testato questo ciclo infinito, ci vorrà meno di 1 secondo per terminare.
for(int i = 10; i > 0; i++) {
System.out.println("infinite: " + i);
}
System.out.println("finished!");
Produzione:
infinite: 314572809
infinite: 314572810
infinite: 314572811
.
.
.
infinite: 2147483644
infinite: 2147483645
infinite: 2147483646
infinite: 2147483647
finished!
BUILD SUCCESSFUL (total time: 486 minutes 25 seconds)
In questo caso di prova noterai un'enorme differenza nel tempo impiegato per terminare e completare l'esecuzione del programma.
Se non hai pazienza, penserai che questo ciclo sia infinito e non terminerà, ma in realtà ci vorranno ore per terminare e raggiungere lo stato di overflow al i
valore.
Alla fine abbiamo concluso dopo aver inserito l'istruzione print all'interno del ciclo for che ci vorrà molto più tempo rispetto al ciclo nel primo caso senza l'istruzione print.
Il tempo impiegato per eseguire il programma dipende dalle specifiche del computer, in particolare dalla potenza di elaborazione (capacità del processore), dal sistema operativo e dall'IDE che sta compilando il programma.
Provo questo caso su:
Lenovo 2,7 GHz Intel Core i5
Sistema operativo: Windows 8.1 64x
IDE: NetBeans 8.2
Sono necessarie circa 8 ore (486 minuti) per completare il programma.
Inoltre puoi notare che l'incremento del passo nel ciclo for i = i + 1
è un fattore molto lento per raggiungere il valore massimo int.
Possiamo cambiare questo fattore e rendere l'incremento del passo più veloce per testare il loop in meno tempo.
se lo mettiamo i = i * 10
e lo testiamo:
for(int i = 10; i > 0; i*=10) {
System.out.println("infinite: " + i);
}
System.out.println("finished!");
Produzione:
infinite: 100000
infinite: 1000000
infinite: 10000000
infinite: 100000000
infinite: 1000000000
infinite: 1410065408
infinite: 1215752192
finished!
BUILD SUCCESSFUL (total time: 0 seconds)
Come vedi è molto veloce rispetto al ciclo precedente
ci vuole meno di 1 secondo per terminare e terminare l'esecuzione del programma.
Dopo questo esempio di test penso che dovrebbe chiarire il problema e dimostrare la validità di Zbynek Vyskovsky - la risposta di kvr000 , anche questa sarà la risposta a questa domanda .
x
cresce più velocemente della variabile del cicloj
. In altre parole,j
non raggiungerà mai un limite superiore, quindi il ciclo verrà eseguito "per sempre". Beh, non per sempre, molto probabilmente avrai un overflow ad un certo punto.