2013-05-15 30 views
9

Tôi nhìn lên định nghĩa của MIN trên Mac OS X và thấy điều này:Phạm vi có thể được bao bọc trong dấu ngoặc đơn và trả về một giá trị trong C?

#define MIN(A,B) ({ __typeof__(A) __a = (A); __typeof__(B) __b = (B); __a < __b ? __a : __b; }) 

Nó không phải như vậy rõ ràng lúc đầu, nhưng khi nó mở rộng, nó biến thành cái gì đó trông vô cùng xa lạ với tôi:

int a = 1, b = 2; 
// int min = MIN(a, b); 
int min = ({ 
    int __a = (a); 
    int __b = (b); 
    __a < __b ? __a : __b; 
}); 

Đây thực sự là phạm vi được bao bọc thành một biểu thức "trả về" giá trị của biểu thức cuối cùng. Có vẻ như để làm việc, ít nhất là với kêu vang, với khá nhiều mã bất kỳ bên trong phạm vi:

int a = ({ 
    time_t x = time(NULL); 
    if (x % 3 == 1) 
     x++; 

    x % 10; 
}); 

tôi chưa bao giờ thấy điều này trước đây, và tôi đã tự hỏi nếu nó là tiêu chuẩn. Tôi biết một thực tế là Visual Studio sẽ không chấp nhận nó, nhưng sau đó một lần nữa, Visual Studio là mắc kẹt với C89, vì vậy đó không phải là rất nói.

+0

Có thể điều này sẽ trả lời câu hỏi của bạn: http://en.wikipedia.org/wiki/Blocks_(C_language_extension) – SomeWittyUsername

+7

@icepack, nó không phải là một khối. Các khối cần được gọi với toán tử dấu ngoặc đơn và bắt đầu bằng ký tự '^'. – zneak

+1

FWIW, tôi không tìm thấy gì trong [ISO 9899: 1999] (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf). (Điều này không có nghĩa là nó không có ở đó, nhưng chắc chắn không phải trong những gì tôi nghĩ là những nơi hiển nhiên.) – millimoose

Trả lời

9

Đây là phần mở rộng GCC đối với tiêu chuẩn C được gọi là Statement Expressions. Có, bạn có thể sử dụng nó nếu bạn chỉ cần hỗ trợ trình biên dịch GNU (và nó là nền tảng chéo). Nếu bạn cần phải dính vào tiêu chuẩn C, bạn sẽ không sử dụng ký hiệu.

+0

Tìm thấy nó: http://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html cảm ơn. – zneak

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