var*_*han 7 c c++ grammar context-free-grammar
可能重复:
c的哪个版本是用于返回有效值的括号内的块?
以下是典型MAX宏的类型安全版本(适用于gcc 4.4.5):
#define max(a,b) \
({ __typeof__ (a) _a = (a); \
__typeof__ (b) _b = (b); \
_a > _b ? _a : _b; })
Run Code Online (Sandbox Code Playgroud)
在这里,我们看到这个表达式max(a,b)返回表达式的结果
_a > _b ? _a : _b;
Run Code Online (Sandbox Code Playgroud)
即使这个表达式是一个块.所以,我调查过,发现这是有效的C:
int a = ({123;}); // a is 123
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么这是有效的语法和({statements})的真实行为是什么?另外,您会注意到{123;}不是有效的表达式,而只是({123;}).
osg*_*sgx 16
它不是有效的C99或C89,也不是C++.它是gcc扩展名,称为"语句表达式".用于使用gcc添加选项验证C代码-ansi -pedantic.也是有用的选择-W -Wall -Wextra
语句表达的文档在这里http://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html
这个gnu扩展在GNU代码和Linux中被广泛使用,因此它不仅受到GCC的支持,而且还受到现代编译器的支持,如英特尔C++编译器,Sun Studio,LLVM + clang,......