Интересная проблема На самом деле в обоих случаях цикл не бесконечен
Но основное различие между ними заключается в том, когда он завершится и сколько времени x
потребуется, чтобы превысить максимальное int
значение, 2,147,483,647
после чего он достигнет состояния переполнения, и цикл завершится.
Лучший способ разобраться в этой проблеме - проверить простой пример и сохранить его результаты.
Пример :
for(int i = 10; i > 0; i++) {}
System.out.println("finished!");
Выход:
finished!
BUILD SUCCESSFUL (total time: 0 seconds)
После тестирования этого бесконечного цикла на завершение потребуется менее 1 секунды.
for(int i = 10; i > 0; i++) {
System.out.println("infinite: " + i);
}
System.out.println("finished!");
Выход:
infinite: 314572809
infinite: 314572810
infinite: 314572811
.
.
.
infinite: 2147483644
infinite: 2147483645
infinite: 2147483646
infinite: 2147483647
finished!
BUILD SUCCESSFUL (total time: 486 minutes 25 seconds)
В этом тестовом примере вы заметите огромную разницу во времени, необходимом для завершения и завершения работы программы.
Если вы не наберетесь терпения, вы подумаете, что этот цикл бесконечен и не завершится, но на самом деле на завершение и достижение состояния переполнения по i
значению потребуется несколько часов .
Наконец, после помещения оператора печати внутрь цикла for мы пришли к выводу, что это займет гораздо больше времени, чем цикл в первом случае без оператора печати.
Время, необходимое для запуска программы, зависит от технических характеристик вашего компьютера, в частности от вычислительной мощности (мощности процессора), операционной системы и вашей среды разработки, которая компилирует программу.
Я тестирую этот случай на:
Lenovo 2,7 ГГц Intel Core i5
ОС: Windows 8.1 64x
IDE: NetBeans 8.2
Завершение программы занимает около 8 часов (486 минут).
Также вы можете заметить, что приращение шага в цикле for i = i + 1
является очень медленным фактором для достижения максимального значения int.
Мы можем изменить этот коэффициент и увеличить шаг приращения, чтобы проверить цикл за меньшее время.
если поставить i = i * 10
и протестировать:
for(int i = 10; i > 0; i*=10) {
System.out.println("infinite: " + i);
}
System.out.println("finished!");
Выход:
infinite: 100000
infinite: 1000000
infinite: 10000000
infinite: 100000000
infinite: 1000000000
infinite: 1410065408
infinite: 1215752192
finished!
BUILD SUCCESSFUL (total time: 0 seconds)
Как видите, это очень быстро по сравнению с предыдущим циклом.
для завершения и завершения выполнения программы требуется менее 1 секунды.
После этого тестового примера, я думаю, он должен прояснить проблему и доказать справедливость ответа Збынека Высковского - kvr000 , также он будет ответом на этот вопрос .
x
растет быстрее, чем переменная циклаj
. Другими словами,j
никогда не достигнет верхней границы, следовательно, цикл будет работать «вечно». Ну, не навсегда, скорее всего, в какой-то момент у вас будет переполнение.