为什么这个有效的C? ---({123;})评估为123

时间:2010-12-17 23:56:08

标签: c++ c grammar context-free-grammar

  

可能重复:
  in what versions of c is a block inside parenthesis used to return a value valid?

以下是典型MAX宏的类型安全版本(适用于gcc 4.4.5):

#define max(a,b) \
({ __typeof__ (a) _a = (a); \
   __typeof__ (b) _b = (b); \
 _a > _b ? _a : _b; })

在这里,我们看到这个表达式max(a,b)返回表达式的结果

_a > _b ? _a : _b;

即使这个表达式在一个块中。所以,我调查过,发现这是有效的C:

int a = ({123;}); // a is 123

有人可以解释为什么这是有效的语法以及({statements})的真实行为是什么?另外,您会注意到{123;}不是有效的表达式,而只是({123;})。

1 个答案:

答案 0 :(得分:16)

它不是有效的C99或C89,也不是C ++。它是gcc扩展名,称为“语句表达式”。使用gcc添加选项-ansi -pedantic验证C代码。另外有用的选项是-W -Wall -Wextra

语句表达式的文档位于http://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html

这个gnu扩展在GNU代码和Linux中被广泛使用,因此它不仅受到GCC的支持,而且还受到现代编译器的支持,如英特尔C ++编译器,Sun Studio,LLVM + clang,......