Vấn đề thú vị Thực ra trong cả hai trường hợp, vòng lặp không phải là vô tận
Nhưng sự khác biệt chính giữa chúng là khi nào nó sẽ kết thúc và mất bao nhiêu thời gian x
để vượt quá int
giá trị tối đa là2,147,483,647
sau đó nó sẽ đạt đến trạng thái tràn và vòng lặp sẽ kết thúc.
Cách tốt nhất để hiểu vấn đề này là kiểm tra một ví dụ đơn giản và bảo toàn kết quả của nó.
Ví dụ :
for(int i = 10; i > 0; i++) {}
System.out.println("finished!");
Đầu ra:
finished!
BUILD SUCCESSFUL (total time: 0 seconds)
Sau khi thử nghiệm vòng lặp vô hạn này, sẽ mất chưa đầy 1 giây để kết thúc.
for(int i = 10; i > 0; i++) {
System.out.println("infinite: " + i);
}
System.out.println("finished!");
Đầu ra:
infinite: 314572809
infinite: 314572810
infinite: 314572811
.
.
.
infinite: 2147483644
infinite: 2147483645
infinite: 2147483646
infinite: 2147483647
finished!
BUILD SUCCESSFUL (total time: 486 minutes 25 seconds)
Trong trường hợp thử nghiệm này, bạn sẽ nhận thấy sự khác biệt rất lớn về thời gian thực hiện để kết thúc và chạy chương trình.
Nếu bạn không kiên nhẫn, bạn sẽ nghĩ rằng vòng lặp này là vô tận và sẽ không kết thúc nhưng thực tế sẽ mất hàng giờ để kết thúc và đạt đến trạng thái tràn tại i
giá trị.
Cuối cùng, chúng tôi kết luận sau khi chúng tôi đặt câu lệnh print bên trong vòng lặp for rằng nó sẽ mất nhiều thời gian hơn vòng lặp trong trường hợp đầu tiên không có câu lệnh print.
Thời gian cần thiết để chạy chương trình phụ thuộc vào thông số kỹ thuật máy tính của bạn, cụ thể là sức mạnh xử lý (dung lượng bộ xử lý), hệ điều hành và IDE của bạn đang biên dịch chương trình.
Tôi kiểm tra trường hợp này trên:
Lenovo Intel Core i5 2,7 GHz
Hệ điều hành: Windows 8.1 64x
IDE: NetBeans 8.2
Mất khoảng 8 giờ (486 phút) để kết thúc chương trình.
Ngoài ra, bạn có thể nhận thấy rằng bước tăng trong vòng lặp for i = i + 1
là yếu tố rất chậm để đạt đến giá trị int tối đa.
Chúng tôi có thể thay đổi hệ số này và tăng số bước nhanh hơn để kiểm tra vòng lặp trong thời gian ngắn hơn.
nếu chúng tôi đặt i = i * 10
và kiểm tra nó:
for(int i = 10; i > 0; i*=10) {
System.out.println("infinite: " + i);
}
System.out.println("finished!");
Đầu ra:
infinite: 100000
infinite: 1000000
infinite: 10000000
infinite: 100000000
infinite: 1000000000
infinite: 1410065408
infinite: 1215752192
finished!
BUILD SUCCESSFUL (total time: 0 seconds)
Như bạn thấy, nó rất nhanh so với vòng lặp trước đó
chỉ mất chưa đầy 1 giây để kết thúc và chạy chương trình.
Sau ví dụ thử nghiệm này, tôi nghĩ rằng nó sẽ làm rõ vấn đề và chứng minh tính hợp lệ của câu trả lời của Zbynek Vyskovsky - kvr000 , nó cũng sẽ là câu trả lời cho câu hỏi này .
x
phát triển nhanh hơn biến vòng lặpj
. Nói cách khác,j
sẽ không bao giờ đạt đến giới hạn trên, do đó vòng lặp sẽ chạy "mãi mãi". Chà, không phải mãi mãi, rất có thể bạn sẽ bị tràn vào một lúc nào đó.