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.
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
@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
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