Цікава проблема Насправді в обох випадках цикл не є нескінченним
Але головна різниця між ними полягає в тому, коли він закінчиться і скільки часу 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
значенням.
Нарешті, після того, як ми помістили оператор print усередину for циклу, ми дійшли висновку, що це займе набагато більше часу, ніж цикл у першому випадку без оператора print.
Час, необхідний для запуску програми, залежить від технічних характеристик вашого комп’ютера, зокрема обчислювальної потужності (потужності процесора), операційної системи та вашої IDE, яка складає програму.
Я перевіряю цей випадок на:
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
ніколи не потрапить на верхню межу, отже, цикл працюватиме "назавжди". Ну, не назавжди, швидше за все ви отримаєте перелив.