ปัญหาที่น่าสนใจจริงๆแล้วในทั้งสองกรณีวนซ้ำไม่สิ้นสุด
แต่ความแตกต่างที่สำคัญระหว่างพวกเขาคือเวลาที่จะสิ้นสุดและระยะเวลาที่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
ตามมูลค่า
ในที่สุดเราก็ได้ข้อสรุปหลังจากที่เราใส่คำสั่งพิมพ์ภายในสำหรับการวนซ้ำว่าจะใช้เวลามากกว่าการวนซ้ำในกรณีแรกที่ไม่มีคำสั่งพิมพ์
เวลาที่ใช้ในการรันโปรแกรมนั้นขึ้นอยู่กับข้อกำหนดของคอมพิวเตอร์ของคุณในด้านพลังการประมวลผลโดยเฉพาะ (ความจุของโปรเซสเซอร์) ระบบปฏิบัติการและ IDE ของคุณซึ่งกำลังรวบรวมโปรแกรม
ฉันทดสอบกรณีนี้เมื่อ:
เลอโนโว 2.7 GHz Intel Core i5
ระบบปฏิบัติการ: Windows 8.1 64x
IDE: NetBeans 8.2.2
ใช้เวลาประมาณ 8 ชั่วโมง (486 นาที) เพื่อจบรายการ
นอกจากนี้คุณสามารถสังเกตได้ว่าการเพิ่มขั้นตอนใน for loop 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 วินาทีในการยุติและรันโปรแกรมให้เสร็จสิ้น
หลังจากตัวอย่างการทดสอบนี้ฉันคิดว่าควรชี้แจงปัญหาและพิสูจน์ความถูกต้องของคำตอบของZbynek Vyskovsky - kvr000ก็จะเป็นคำตอบสำหรับคำถามนี้
x
เติบโตได้เร็วขึ้นj
กว่าตัวแปร loop กล่าวอีกนัยหนึ่งคือj
จะไม่ชนขอบเขตบนดังนั้นลูปจะทำงาน "ตลอดไป" ไม่ใช่ตลอดไปคุณจะได้รับน้ำล้นในบางจุดที่เป็นไปได้มากที่สุด