2012-07-11 31 views
9

Tôi tự hỏi nếu x sẽ bao giờ đạt đến số không trong chương trình sau đây.Giá trị có bao giờ là 0 sau khi thay đổi "x << = 1" nhiều lần không?

hãy xem xét:

int main() 
{ 
    int x = 1; 
    while (x) 
     { 
     x <<= 1; 
     } 
    return 0; 
} 

nên hành vi dự kiến ​​của chương trình này được thoát bình thường hoặc vòng lặp mãi mãi?

+1

Tự mình dùng thử! :) – Wires77

+13

Cố gắng không hoạt động mọi lúc. Đặc biệt là với hành vi không xác định. –

+2

sử dụng 'unsigned int' thay vì' int' và nó sẽ hoạt động. –

Trả lời

18

Không (hoặc cả hai), nó chạy trong hành vi không xác định khi x tràn.

C99 đặc tả phần 6.5.7 nói:

Kết quả của E1 < < E2 là E1 trái chuyển vị trí bit E2; các bit trống được điền bằng số không. Nếu E1 có kiểu không dấu, giá trị của kết quả là E1 × 2 E2, giảm modulo một giá trị lớn hơn giá trị lớn nhất thể hiện trong loại kết quả. Nếu E1 có giá trị loại có ký hiệu và giá trị không âm, và E1 × 2 E2 là thể hiện trong loại kết quả, thì đó là giá trị kết quả; nếu không, hành vi là không xác định.

+2

Cảm ơn câu trả lời nhanh. Nó lặp lại vĩnh viễn với gcc-4.8, nhưng thoát bình thường với tất cả các trình biên dịch khác mà tôi đã thử (clang, icc, gcc-4.7). – user1519088

+2

@ user1519088 có hành vi không xác định cho bạn :) –

+2

+1, mặc dù cho đầy đủ, nó có thể đáng để chỉ ra hành vi của một 'unsigned int', có thể sẽ trả lời câu hỏi * dự định của OP. –

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