İlginç bir problem Aslında her iki durumda da döngü sonsuz değil
Ancak aralarındaki temel fark, ne zaman sona ereceği ve x
maksimum int
değeri aşmak için ne kadar zaman alacağıdır , 2,147,483,647
bundan sonra taşma durumuna ulaşacak ve döngü sona erecektir.
Bu sorunu anlamanın en iyi yolu, basit bir örneği test etmek ve sonuçlarını korumaktır.
Örnek :
for(int i = 10; i > 0; i++) {}
System.out.println("finished!");
Çıktı:
finished!
BUILD SUCCESSFUL (total time: 0 seconds)
Bu sonsuz döngüyü test ettikten sonra sonlandırılması 1 saniyeden az sürecektir.
for(int i = 10; i > 0; i++) {
System.out.println("infinite: " + i);
}
System.out.println("finished!");
Çıktı:
infinite: 314572809
infinite: 314572810
infinite: 314572811
.
.
.
infinite: 2147483644
infinite: 2147483645
infinite: 2147483646
infinite: 2147483647
finished!
BUILD SUCCESSFUL (total time: 486 minutes 25 seconds)
Bu test senaryosunda, programı sonlandırmak ve bitirmek için geçen sürede büyük bir fark göreceksiniz.
Sabırlı değilseniz, bu döngünün sonsuz olduğunu ve sona ermeyeceğini düşüneceksiniz, ancak aslında sona erdirmek ve taşma durumuna i
değer olarak ulaşmak saatler alacaktır .
Son olarak, for döngüsünün içine print deyimini koyduktan sonra, print deyimi olmayan ilk durumda döngüden çok daha fazla zaman alacağını anladık.
Programı çalıştırmak için geçen süre bilgisayarınızın özelliklerine, özellikle işlem gücüne (işlemci kapasitesi), işletim sistemine ve programı derleyen IDE'nize bağlıdır.
Bu durumu test ediyorum:
Lenovo 2.7 GHz Intel Core i5
İşletim Sistemi: Windows 8.1 64x
IDE: NetBeans 8.2
Programı bitirmek yaklaşık 8 saat (486 dakika) sürer.
Ayrıca, for döngüsündeki adım artışının i = i + 1
maks. İnt değerine ulaşmak için çok yavaş olduğunu fark edebilirsiniz .
Döngüyü daha kısa sürede test etmek için bu faktörü değiştirebilir ve adım artışını daha hızlı yapabiliriz.
koyup i = i * 10
test edersek :
for(int i = 10; i > 0; i*=10) {
System.out.println("infinite: " + i);
}
System.out.println("finished!");
Çıktı:
infinite: 100000
infinite: 1000000
infinite: 10000000
infinite: 100000000
infinite: 1000000000
infinite: 1410065408
infinite: 1215752192
finished!
BUILD SUCCESSFUL (total time: 0 seconds)
Gördüğünüz gibi önceki döngüye göre çok hızlı
programı çalıştırmayı sonlandırmak ve bitirmek 1 saniyeden az sürer.
Bu test örneğinden sonra, Zbynek Vyskovsky'nin soruna açıklık getirmesi ve geçerliliğini kanıtlaması gerektiğini düşünüyorum - kvr000'in cevabı , bu soruya da cevap olacaktır .
x
büyür . Başka bir deyişle, hiçbir zaman bir üst sınıra ulaşmayacak, dolayısıyla döngü "sonsuza kadar" çalışacaktır. Eh, sonsuza kadar değil, büyük olasılıkla bir noktada taşacaksın.j
j