C 中的复合语句表达式

Compound Statement Expression In C

以下代码无效。

int i = {(void) 999; 100;}; 

添加括号即可。为什么?

int i = ({(void) 999; 100;}); 

还有另一种方法可以进行此类赋值:

int i = ((void) 999, 100); 

它们有什么不同?

在此声明中

int i = {(void) 999; 100;}; 

大括号内使用了两个语句

(void) 999; 

100;

作为初始值设定项。

这在语法上是无效的。要使用括在大括号中的列表来初始化标量对象,您可以只使用一个赋值表达式,而不使用任何语句。

这个构造

int i = ({(void) 999; 100;});

也是一个无效的 C 结构。然而,括在圆括号中的复合语句可能在 GNU C 中显示为表达式。它是它自己的语言扩展。表达式的值为100,即变量i初始化为100。

这个声明

int i = ((void) 999, 100); 

是唯一有效的 C 结构。在括号内使用了逗号运算符。表达式的值是表达式最右边的操作数,即 100。

实际上最后一个声明等同于

int i = 100;

编译器应发出警告,指出表达式 ( void )999 无效。