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 无效。
以下代码无效。
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 无效。