2010-08-16 25 views
7

Đối với mã,Tại sao MSVC tạo ra cảnh báo C4127 khi liên tục được sử dụng trong "trong khi" - C

while(1) 
{ 
    /* ..... */ 
} 

MSVC tạo ra các cảnh báo sau đây.

warning C4127: conditional expression is constant 

MSDN trang cho các cảnh báo cho thấy sử dụng for(;;) thay vì while(1). Tôi đang tự hỏi những gì lợi thế for(;;) được đưa ra và tại sao nó cảnh báo cho việc sử dụng liên tục trong while?

Tôi nên sử dụng cờ nào trên GCC để nhận được cảnh báo tương tự?

Trả lời

12

Điều kiện liên tục thường đủ đơn giản là lỗi. Hãy xem xét điều này:

unsigned k; 
... 
while (k>=0) 
{ 
... 
} 

Điều kiện k>=0 sẽ có ý nghĩa nếu k là int đã ký, nhưng không phải là chưa ký. Một nhà phát triển bất cẩn quên rằng k đã được tuyên bố unsigned và anh/cô ấy sẽ sử dụng nó như thể nó có thể sử dụng như một số âm. Trình biên dịch cố gắng hữu ích và cảnh báo bạn về điều này và while(1) rơi cho trình biên dịch vào cùng một lớp vấn đề. for(;;) là thích hợp hơn vì nó rõ ràng có nghĩa là 'vòng lặp mãi mãi

+0

+1 để đề cập đến các lỗi đăng nhập chung. :-) –

+3

Trình biên dịch khá thông minh; đủ thông minh để làm tất cả các loại ma thuật, nhưng không đủ thông minh để hiểu rằng "trong khi (đúng)" không phải là đối tượng của những vấn đề đó? –

8

for(;;)while (true) là khác nhau ở chỗ trước đây là một trường hợp đặc biệt được xác định là một vòng lặp vô hạn, trong khi sau này là loại một sự lạm dụng nói "true, luôn luôn."

Cảnh báo xuất hiện vì vòng lặp vô hạn khi you don't want them khá tệ, vì vậy cảnh báo bạn rằng bạn có thể có dấu hiệu đầu tiên. Nhưng bằng cách sử dụng for(;;), bạn đã khá rõ ràng nói "lặp lại điều này mãi mãi", và không có gì để cảnh báo.

Tôi không nghĩ GCC có cảnh báo tương đương.

+0

cảm ơn. điều đó có ý nghĩa. –

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