Câu trả lời cho một câu hỏi gần đây về for(;;){}
vòng (What does a for (;;) loop do) dường như không trả lời điều gì đó cho tôi, vì vậy tôi nghĩ rằng tôi sẽ cố gắng tinh chỉnh câu hỏi một chút. Đặc biệt, ngoài việc biết rằng for
vòng mà không có điều kiện là vòng vô hạn, tôi muốn biết lý do tại sao họ là vòng vô hạn.Tại sao vòng lặp (;;) hoạt động như vòng lặp vô hạn?
Trong tuyên bố for (;_;){}
, _
là biểu thức có điều kiện. Dự đoán đầu tiên của tôi là biểu thức trống có thể đánh giá là 0
hoặc NULL
. Nhưng nếu bạn thử nghiệm:
for (;;){}
là vòng lặp vô hạn, như mọi người đã chỉ ra.
for (;1;){}
là vòng lặp vô hạn.
Nhưng không ai trong số các cơ quan này thực hiện vòng lặp tại tất cả:
for (;0;){}
for (;NULL;){}
Như vậy, biểu thức điều kiện có sản phẩm nào dường như không đánh giá hoặc là 0
hoặc NULL
. Vì vậy, câu hỏi của tôi: là hành vi của vòng lặp for (;;){}
một cách tạo ra cách C đánh giá các biểu thức, hay nó chỉ là một trường hợp được xác định đặc biệt, bởi vì một vòng lặp không bao giờ thực thi không hữu ích?
CẬP NHẬT: Sau khi đọc nhận xét và câu trả lời, tôi nhận ra rằng câu hỏi của tôi không được xây dựng rõ ràng như đã có. Tôi cho rằng vấn đề là hai lần:
là hành vi của
for(;;){}
vòng đúng một kết quả của cách mà C đánh giá biểu thức nói chung, hoặc là hành vi này đặc trưng cho cách mà C đánh giáfor
báo cáo? Nó chỉ ra rằng thứ hai của các lựa chọn thay thế là trường hợp, và khi phản ánh thêm điều này chỉ có ý nghĩa. Thông thường một biểu thức bị thiếu gây nên lỗi trình biên dịch. Ví dụ:while(){}
sẽ không biên dịch.Tại sao hành vi này được chọn cho các vòng
for
thiếu biểu thức điều kiện? Ban đầu tôi đề nghị rằng nó không phải là rất hữu ích để có một vòng lặpfor
với một cơ thể mà không bao giờ thực hiện. Nhưng nó xảy ra với tôi rằng, nếu bạn nhầm lẫn để lại điều kiện ra khỏi tuyên bốfor
của bạn, theo các quy tắc của tiêu chuẩn, chương trình của bạn sẽ có khả năng sụp đổ vào một vòng lặp vô hạn. Điều này có thể gây ngạc nhiên, nhưng ít nhất bạn biết nó bị rơi ở đâu. Nhưng nếu các hành vi thay thế là quy tắc, chương trình của bạn sẽ bỏ qua cơ thể củafor
, có thể dẫn đến một số bất ngờ rất khó chịu người biết-ở đâu. Vì vậy, việc áp dụng nguyên lý ít ngạc nhiên nhất, hành vi vòng lặp vô hạn là điều mong muốn hơn. Như @martin đã chỉ ra, đây chỉ là một mặc định hợp lý cho các vòngfor
.
Cảm ơn mọi người, đã nhận xét và trả lời và giúp tôi làm rõ câu hỏi của mình.
Bạn có thể nghĩ tiêu đề câu hỏi mô tả hơn không? Lý tưởng nhất, tiêu đề sẽ giúp những người khác có cùng câu hỏi đến đây trong tương lai. –
Nhận xét công bằng, @matt - Tôi đã thay đổi tiêu đề. Điều này có hữu ích hơn không? –
"Dự đoán đầu tiên của tôi là biểu thức trống có thể đánh giá là' 0' hoặc 'NULL' - tại sao? Cả C và C++ đều không có khái niệm như "biểu thức rỗng". Điều đó tức là có nghĩa là không gian trống thay cho điều kiện 'for' sẽ điều trị đặc biệt, nó được đưa ra trong đặc tả của hành vi' for'. – AnT