2012-01-02 32 views
10

Tôi đã đi qua một tình huống như thế này một vài lần:Điều gì sẽ xảy ra khi một nơi đặt dấu chấm phẩy sau điều kiện của vòng lặp while?

while (true) { 

while (age == 5); //What does this semi-colon indicate? 
//Code 
//Code 
//Code 

} 

Các while(true) chỉ ra rằng đây là một vòng lặp vô hạn, nhưng tôi gặp khó khăn khi tìm hiểu những gì các dấu chấm phẩy sau khi tình trạng while hoàn thành, isn' T nó tương đương với điều này ?:

while (age == 5) { } 

//Code 
//Code 

Nói cách khác, điều đó có nghĩa rằng while vòng lặp là vô ích vì nó không bao giờ đi vào khối?

+2

Bạn có hỏi về C hoặc C# không? Bạn đã gắn thẻ câu hỏi với cả hai. – Oded

+0

Tôi havnt một đầu mối ... một cách hợp lý nó sẽ không làm gì cả – craig1231

+0

Tôi đã nhìn thấy nó xảy ra trong cả hai, nó có hoạt động khác nhau trong cả hai ngôn ngữ? –

Trả lời

22
while (age == 5);  // empty statement 

tương đương với

while (age == 5) { } // empty block 

Cập nhật: Thậm chí nếu không có cơ thể để thực hiện, không có nghĩa là vòng lặp kết thúc. Thay vào đó, nó sẽ lặp lại nhiều lần trên điều kiện (có thể có hoặc dựa vào các hiệu ứng phụ) cho đến khi nó được thỏa mãn. Dưới đây là hình thức tương đương với một goto:

loop: 
if (age == 5) 
    goto loop; 

xây dựng Đây là đôi khi sử dụng như một busy-loop chờ đợi vào một lá cờ phải được thay đổi trong mã ren. (Việc sử dụng chính xác và tính hợp lệ thay đổi một chút tốt bằng ngôn ngữ, thuật toán, và môi trường thực hiện.)

tôi thấy việc sử dụng các ; cho một "khối trống rỗng" tuyên bố rỗng một xây dựng đáng ngờ sử dụng vì các vấn đề như thế này:

while (age == 5); { 
    Console.WriteLine("I hate debugging"); 
} 

(tôi đã thấy lỗi này nhiều lần trước đây, khi mã mới đã được bổ sung.)

Chúc mừng mã hóa.

+0

Đó là những gì tôi nghĩ - những gì gây nhầm lẫn cho tôi là tôi đã nhìn thấy nó được thực hiện vô số lần để minh họa các vấn đề đồng bộ hóa đa luồng. Tôi nghi ngờ đó là một sai lầm vì nó lặp lại. –

+0

@Sean Cú pháp tương đương. Có lẽ 'tuổi' là (" dễ bay hơi "và) được thiết lập bởi một luồng khác - vì vậy nó không nhất thiết phải là một" sai lầm "để sử dụng thành ngữ này (nhưng tôi lập luận chống lại cấu trúc cụ thể). –

+0

Tôi đọc ở đâu đó rằng trình biên dịch được phép tối ưu hóa các vòng lặp vô hạn như thế này; hãy để tôi xem nếu tôi có thể tìm thấy nơi tôi đọc này ... –

1

while (age == 5); bị kẹt vào vòng lặp vô hạn. Trong c ; là một terminator null. Trình biên dịch giả định rằng vòng lặp trên chỉ có một câu lệnh là ; làm cho vòng lặp được lặp lại qua vô hạn.

1

một tuyên bố gồm chỉ

;

là một tuyên bố null. Nó giống như một khối (còn được gọi là tuyên bố hợp chất) không có gì bên trong

{ 
} 

Cả hai đều không hoạt động.

0

Nếu chúng tôi đặt ; bất cứ nơi nào nó có nghĩa là null tuyên bố (tuyên bố không có gì).

Khi chúng tôi viết

while(true); 

Nó có nghĩa là một vòng lặp trong khi một một tuyên bố rằng không có gì.Nó tương tự như báo cáo kết quả

while(true) 
i++; 

Đây không phải là null nhưng trong trường hợp tuyên bố trước đó là null.

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