Masalah yang menarik Sebenarnya dalam kedua kasus loop tidak ada habisnya
Tetapi perbedaan utama di antara mereka adalah kapan itu akan berakhir dan berapa banyak waktu yang x
dibutuhkan untuk melebihi int
nilai maks yang 2,147,483,647
setelah itu akan mencapai keadaan luapan dan loop akan berakhir.
Cara terbaik untuk memahami masalah ini adalah dengan menguji contoh sederhana dan mempertahankan hasilnya.
Contoh :
for(int i = 10; i > 0; i++) {}
System.out.println("finished!");
Keluaran:
finished!
BUILD SUCCESSFUL (total time: 0 seconds)
Setelah menguji loop tak terbatas ini, dibutuhkan waktu kurang dari 1 detik untuk berhenti.
for(int i = 10; i > 0; i++) {
System.out.println("infinite: " + i);
}
System.out.println("finished!");
Keluaran:
infinite: 314572809
infinite: 314572810
infinite: 314572811
.
.
.
infinite: 2147483644
infinite: 2147483645
infinite: 2147483646
infinite: 2147483647
finished!
BUILD SUCCESSFUL (total time: 486 minutes 25 seconds)
Pada kasus pengujian ini, Anda akan melihat perbedaan besar dalam waktu yang dibutuhkan untuk menghentikan dan menyelesaikan program.
Jika Anda tidak sabar, Anda akan berpikir loop ini tidak ada habisnya dan tidak akan berakhir tetapi pada kenyataannya akan memakan waktu berjam-jam untuk mengakhiri dan mencapai keadaan overflow pada i
nilainya.
Akhirnya kami menyimpulkan setelah kami meletakkan pernyataan print di dalam for loop bahwa itu akan membutuhkan lebih banyak waktu daripada loop dalam kasus pertama tanpa pernyataan print.
Waktu yang dibutuhkan untuk menjalankan program tergantung pada spesifikasi komputer Anda khususnya kekuatan pemrosesan (kapasitas prosesor), sistem operasi dan IDE Anda yang sedang menyusun program.
Saya menguji kasus ini pada:
Lenovo 2,7 GHz Intel Core i5
OS: Windows 8.1 64x
IDE: NetBeans 8.2
Dibutuhkan sekitar 8 jam (486 menit) untuk menyelesaikan program ini.
Anda juga dapat melihat bahwa kenaikan langkah di loop for i = i + 1
adalah faktor yang sangat lambat untuk mencapai nilai int maksimal.
Kita dapat mengubah faktor ini dan membuat peningkatan langkah lebih cepat untuk menguji loop dalam waktu yang lebih singkat.
jika kita menempatkan i = i * 10
dan mengujinya:
for(int i = 10; i > 0; i*=10) {
System.out.println("infinite: " + i);
}
System.out.println("finished!");
Keluaran:
infinite: 100000
infinite: 1000000
infinite: 10000000
infinite: 100000000
infinite: 1000000000
infinite: 1410065408
infinite: 1215752192
finished!
BUILD SUCCESSFUL (total time: 0 seconds)
Seperti yang Anda lihat, ini sangat cepat dibandingkan dengan loop sebelumnya
dibutuhkan kurang dari 1 detik untuk menghentikan dan menyelesaikan program yang sedang berjalan.
Setelah contoh tes ini saya pikir itu harus menjelaskan masalah dan membuktikan validitas Zbynek Vyskovsky - jawaban kvr000 , juga akan menjadi jawaban untuk pertanyaan ini .
x
tumbuh lebih cepat daripada variabel loopj
. Dengan kata lain,j
tidak akan pernah mencapai batas atas, karenanya loop akan berjalan "selamanya." Yah, tidak selamanya, kemungkinan besar Anda akan mendapatkan luapan di beberapa titik.