2016-10-01 36 views
6

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:

  1. 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.

  2. 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ặp for 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ủa for, 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òng for.

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.

+2

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. –

+0

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? –

+0

"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

Trả lời

19

Cả C và C++ đều đảm bảo hành vi này.


[C99: 6.8.5.3/1]: Both clause-1 and expression-3 can be omitted. An omitted expression-2 is replaced by a nonzero constant.


[C++14: 6.5.3/1]: The for statement

for (for-init-statement conditionopt; expressionopt) statement 

is equivalent to

{ 
    for-init-statement 
    while (condition) { 
     statement 
     expression ; 
    } 
} 

[..]

[C++14: 6.5.3/2]: Either or both of the condition and the expression can be omitted. A missing condition makes the implied while clause equivalent to while(true) .

+0

Câu trả lời tuyệt vời, @lightness. Vì vậy, hành vi được định nghĩa trong các tiêu chuẩn. –

+0

@DavidBowling: Có. Cú pháp này được cho phép cụ thể và được xác định rõ để làm như bạn đã quan sát. –

+0

Cảm ơn bạn, @lightness. Tôi nghĩ rằng tôi có thể cần phải cuộn tròn với một bản sao của tiêu chuẩn C99 cuối tuần này;) –

0

Các biểu thức điều kiện kiểm tra nếu vòng lặp là được tiếp tục, vâng, và các chức năng mặc định của một vòng lặp là .. để lặp. Nếu nó không phải là một trường hợp đặc biệt có biểu thức kiểm tra rỗng và tiếp tục vòng lặp trong trường hợp này, nó sẽ là trường hợp ngược lại (như bạn đã nhận thấy) và hủy bỏ vòng lặp làm cho toàn bộ câu lệnh for kém hoặc thậm chí dư thừa.

Kỹ thuật được sử dụng ở đây được gọi là mặc định hợp lý/hợp lý.

+0

Cảm ơn bạn đã giải quyết phần này của câu hỏi. Vui lòng xem Cập nhật của tôi cho câu hỏi ban đầu. –

+0

Có. Tôi mất một chút thời gian để hiểu những gì bạn thấy đặc biệt ở đó (và quan sát của bạn là chính xác) và tôi đã biết lúc đó tôi sẽ bị downvoted, bởi vì không phải ai cũng dành thời gian này. ;) –

Các vấn đề liên quan