Problème intéressant En fait, dans les deux cas, la boucle n'est pas sans fin
Mais la principale différence entre eux est quand il se terminera et combien de temps x
il faudra pour dépasser la int
valeur maximale , c'est- 2,147,483,647
à-dire qu'il atteindra l'état de débordement et que la boucle se terminera.
La meilleure façon de comprendre ce problème est de tester un exemple simple et de conserver ses résultats.
Exemple :
for(int i = 10; i > 0; i++) {}
System.out.println("finished!");
Production:
finished!
BUILD SUCCESSFUL (total time: 0 seconds)
Après avoir testé cette boucle infinie, il faudra moins d'une seconde pour se terminer.
for(int i = 10; i > 0; i++) {
System.out.println("infinite: " + i);
}
System.out.println("finished!");
Production:
infinite: 314572809
infinite: 314572810
infinite: 314572811
.
.
.
infinite: 2147483644
infinite: 2147483645
infinite: 2147483646
infinite: 2147483647
finished!
BUILD SUCCESSFUL (total time: 486 minutes 25 seconds)
Sur ce cas de test, vous remarquerez une énorme différence dans le temps nécessaire pour terminer et terminer l'exécution du programme.
Si vous n'êtes pas patient, vous penserez que cette boucle est sans fin et ne se terminera pas, mais en fait, il faudra des heures pour se terminer et atteindre l'état de débordement à la i
valeur.
Enfin, nous avons conclu après avoir mis l'instruction print dans la boucle for que cela prendrait beaucoup plus de temps que la boucle dans le premier cas sans instruction print.
Ce temps nécessaire pour exécuter le programme dépend des spécifications de votre ordinateur, en particulier de la puissance de traitement (capacité du processeur), du système d'exploitation et de votre IDE qui compile le programme.
Je teste ce cas sur:
Lenovo 2,7 GHz Intel Core i5
Système d'exploitation: Windows 8.1 64x
IDE: NetBeans 8.2
Il faut environ 8 heures (486 minutes) pour terminer le programme.
Vous pouvez également remarquer que l'incrément de pas dans la boucle for i = i + 1
est un facteur très lent pour atteindre la valeur max int.
Nous pouvons changer ce facteur et accélérer l'incrémentation des pas afin de tester la boucle en moins de temps.
si nous le mettons i = i * 10
et le testons:
for(int i = 10; i > 0; i*=10) {
System.out.println("infinite: " + i);
}
System.out.println("finished!");
Production:
infinite: 100000
infinite: 1000000
infinite: 10000000
infinite: 100000000
infinite: 1000000000
infinite: 1410065408
infinite: 1215752192
finished!
BUILD SUCCESSFUL (total time: 0 seconds)
Comme vous le voyez, c'est très rapide par rapport à la boucle précédente
cela prend moins d'une seconde pour se terminer et terminer l'exécution du programme.
Après cet exemple de test, je pense qu'il devrait clarifier le problème et prouver la validité de Zbynek Vyskovsky - la réponse de kvr000 , aussi ce sera la réponse à cette question .
x
croît plus vite que la variable de bouclej
. En d'autres termes,j
n'atteindra jamais une limite supérieure, donc la boucle fonctionnera "pour toujours". Eh bien, pas pour toujours, vous aurez probablement un débordement à un moment donné.