在GNU C中包含在括号中的复合语句可以作为一个表达式。这就允许你在表达式中使用循环,switch和局部变量。
以前复合语句是包含在大括号中语句序列。在这种构造中,圆括号包围在大括号中。如下面的例子:
({ int y = foo(); int z;
if ( y > 0 ) z = y;
else z = -y;
z;
})
上面的例子是一个有效的表达式。在复合语句构造中的最后一部分应该是一个表达式后面跟一个分号,这个子表达式的值充当整个复合语句构造的值。如果你使用的是其他类型的语句放在括号中的最后面,那么这个复合语句构造的类型为void类型,也就是没有返回值。
这种复合语句构造对于宏定义安全特别有用。比如下面的例子:
#define max(a,b) ( (a) > (b) ? (a) : (b) )
在上面的例子中a或者b的计算会进行两次,如果这种计算操作会产生副作用,那么会产生坏的结果。
但是在GNU C中,你可以使用下面的方式,如果你知道a和b的类型的话,假设都为整型:
#define max(a,b) ({ int _a = (a), _b = (b); _a > _b ? _a : _b;})
如果不知道a和b的类型的话,那么可以使用typeof语句,如下:
#define max(a,b) ({ typeof (a) _a = (a); typeof (b) _b = (b); _a > _b? _a : _b ; })
这样就可以减少计算次数
这种嵌套的语句不允许在常量表达式中。