2014-08-31 12 views
6

Gần đây tôi đã đọc this page về mã đoạn mã C lạ. Hầu hết trong số họ là dễ hiểu. Nhưng tôi không thể hiểu điều này:Mixed 'switch' và 'while' trong C

switch(c & 3) while((c -= 4) >= 0){ 
    foo(); case 3: 
    foo(); case 2: 
    foo(); case 1: 
    foo(); case 0: 
} 

Bất kỳ ai có thể vui lòng giúp tôi hiểu điều gì đằng sau mã này không? Và làm như thế nào?

+8

http://en.wikipedia.org/wiki/Duff%27s_device – interjay

+1

có thể trùng lặp [Làm cách nào để mã thiết bị của Duff có thể được biên dịch?] (Http://stackoverflow.com/questions/5569416/how-can-duffs -device-code-be-biên dịch) – usr2564301

+1

Đó không phải là hợp lệ C. Bạn phải có _statement_ sau mỗi nhãn 'case'. –

Trả lời

4

comment Thiết bị của Duff nên giải thích nền cũng đủ, vì vậy tôi sẽ cố gắng giải thích trường hợp rất này:

Công tắc kiểm tra 2 bit cuối cùng của c, và nhảy đến trường tuyên bố tương ứng bên trong trong khi vòng lặp. Mã bên dưới câu lệnh case cũng được thực thi. Kiểm soát sau đó đạt đến kết thúc của vòng lặp while, do đó, nó nhảy đến đầu một lần nữa để kiểm tra xem điều kiện vẫn đúng. Nếu có, tất cả các câu lệnh bên trong vòng lặp được thực hiện và vòng lặp được lặp lại cho đến khi điều kiện là sai. Chuyển đổi ban đầu thường đảm bảo rằng c sẽ là bội số của 4 khi vòng lặp while chạy lần đầu tiên.

Chỉnh sửa: duff's device on Wikipedia. Thêm liên kết để làm cho rõ ràng hơn những gì tôi có nghĩa là với "bình luận thiết bị của duff". Xin vui lòng xem xét upvoting bình luận của interjay nếu bạn upvote câu trả lời này.