Interessantes Problem In beiden Fällen ist die Schleife nicht endlos
Der Hauptunterschied zwischen ihnen besteht jedoch darin, wann sie beendet werden und wie viel Zeit benötigt x
wird, um den int
Maximalwert zu überschreiten. Danach 2,147,483,647
erreicht sie den Überlaufzustand und die Schleife endet.
Der beste Weg, um dieses Problem zu verstehen, besteht darin, ein einfaches Beispiel zu testen und die Ergebnisse beizubehalten.
Beispiel :
for(int i = 10; i > 0; i++) {}
System.out.println("finished!");
Ausgabe:
finished!
BUILD SUCCESSFUL (total time: 0 seconds)
Nach dem Testen dieser Endlosschleife dauert das Beenden weniger als 1 Sekunde.
for(int i = 10; i > 0; i++) {
System.out.println("infinite: " + i);
}
System.out.println("finished!");
Ausgabe:
infinite: 314572809
infinite: 314572810
infinite: 314572811
.
.
.
infinite: 2147483644
infinite: 2147483645
infinite: 2147483646
infinite: 2147483647
finished!
BUILD SUCCESSFUL (total time: 486 minutes 25 seconds)
In diesem Testfall werden Sie einen großen Unterschied in der Zeit feststellen, die zum Beenden und Beenden des Programms benötigt wird.
Wenn Sie nicht geduldig sind, werden Sie denken, dass diese Schleife endlos ist und nicht beendet wird, aber tatsächlich wird es Stunden dauern, bis sie beendet ist und den Überlaufzustand bei i
Wert erreicht.
Nachdem wir die print-Anweisung in die for-Schleife eingefügt haben, haben wir schließlich festgestellt, dass es im ersten Fall ohne print-Anweisung viel länger dauert als die Schleife.
Die zum Ausführen des Programms benötigte Zeit hängt von Ihren Computerspezifikationen ab, insbesondere von der Verarbeitungsleistung (Prozessorkapazität), dem Betriebssystem und Ihrer IDE, die das Programm kompiliert.
Ich teste diesen Fall auf:
Lenovo 2,7 GHz Intel Core i5
Betriebssystem: Windows 8.1 64x
IDE: NetBeans 8.2
Das Beenden des Programms dauert ca. 8 Stunden (486 Minuten).
Sie können auch feststellen, dass das Schrittinkrement in der for-Schleife i = i + 1
ein sehr langsamer Faktor ist, um den maximalen int-Wert zu erreichen.
Wir können diesen Faktor ändern und das Schrittinkrement beschleunigen, um die Schleife in kürzerer Zeit zu testen.
wenn wir es setzen i = i * 10
und testen:
for(int i = 10; i > 0; i*=10) {
System.out.println("infinite: " + i);
}
System.out.println("finished!");
Ausgabe:
infinite: 100000
infinite: 1000000
infinite: 10000000
infinite: 100000000
infinite: 1000000000
infinite: 1410065408
infinite: 1215752192
finished!
BUILD SUCCESSFUL (total time: 0 seconds)
Wie Sie sehen, ist es im Vergleich zur vorherigen Schleife sehr schnell
Das Beenden und Beenden des Programms dauert weniger als 1 Sekunde.
Nach diesem Testbeispiel sollte es meines Erachtens das Problem klären und die Gültigkeit der Antwort von Zbynek Vyskovsky - kvr000 beweisen . Auch diese Frage wird beantwortet .
x
wächst als die Schleifenvariable . Mit anderen Worten, wird niemals eine Obergrenze erreichen, daher wird die Schleife "für immer" laufen. Nun, nicht für immer, Sie werden höchstwahrscheinlich irgendwann einen Überlauf bekommen.j
j