2011-08-19 43 views
5

Trong khi đọc http://en.wikipedia.org/wiki/C_preprocessor#Multiple_evaluation_of_side_effects, tôi đi qua ví dụ này:C khối trở thành biểu: ({int a = 1; int b = 2; a + b;}) bằng 3

\#define max(a,b) \ 
    ({ typeof (a) _a = (a); \ 
     typeof (b) _b = (b); \ 
    _a > _b ? _a : _b; }) // WHY DOES THIS LINE WORK? 

nào bạn có thể sử dụng chính xác như một hàm, tức là max(1,2) là một biểu thức đánh giá thành 2.

CÂU HỎI CỦA TÔI là, Làm cách nào để đánh giá giá trị của biểu thức cuối cùng? Cụ thể, cây phân tích cú pháp của cấu trúc này trông như thế nào? Tôi nghĩ rằng { } luôn có nghĩa là một câu lệnh ghép và các câu lệnh không có giá trị. Tôi đã thử đào bới trong ngữ pháp C và vẫn không thể tìm ra vấn đề này.

+0

'42;' cũng là một tuyên bố :-) – paxdiablo

+1

Ah, nhưng tôi nghi ngờ OP biết rằng '42;' là một câu lệnh vì nó là một câu lệnh trong tiêu chuẩn C. Biểu thức câu lệnh là Tuy nhiên, không phải trong Standard C. –

Trả lời

10

Đây là phần mở rộng GCC được gọi là Statement Expressions. Nó không phải là tiêu chuẩn C.

+0

Biểu thức tuyên bố ?! Nghe như đau đầu. – BoltClock

+0

Cảm ơn! Tất nhiên tôi thực sự nên đọc "cả từ khóa typeof và cấu trúc đặt câu lệnh ghép trong dấu ngoặc đơn, là các phần mở rộng không chuẩn được triển khai trong trình biên dịch GNU C phổ biến (GCC)." Rất tiếc. –

+0

Tôi thích chúng. Họ cho phép làm những thứ thông minh như thế này. :) – balki

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