2011-08-19 54 views
5

在阅读http://en.wikipedia.org/wiki/C_preprocessor#Multiple_evaluation_of_side_effects时,我遇到了这个例子:C块变为表达式:({int a = 1; int b = 2; a + b;})等于3

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

你可以像函数一样使用,即max(1,2)是一个评估为2的表达式.

我的问题是,({ statment-list last-expression; })是如何构造的评估为last-expression的值?具体来说,这个结构的解析树是什么样的?我认为{ }总是表示复合语句,而语句没有值。我尝试用 C语法进行挖掘,仍然无法解决这个问题。

+0

'42;'也是一个声明:-) – paxdiablo

+1

啊,但我怀疑OP知道'42;'是一个语句,因为它是标准C语句。语句表达式是不是在标准C中,但是。 –

回答

10

这是一个名为Statement Expressions的GCC扩展。这不是标准C.

+0

语句表达式?!听起来很头疼。 – BoltClock

+0

谢谢!当然,我实际上应该阅读“typeof关键字和在圆括号内放置复合语句的构造,都是在流行的GNU C编译器(GCC)中实现的非标准扩展。”哎呀。 –

+0

我喜欢他们。他们允许做这样聪明的事情。 :) – balki

相关问题