变量1 =({statement 1; statement 2;})在C中构造

bar*_*tal 6 c gcc

main()

{

       int a=10,b=30,c=0;

       if( c =({a+b;b-a;})) 
       {
          printf("%d",c);
       }

}
Run Code Online (Sandbox Code Playgroud)

为什么构造({;})在C中是合法的,为什么它返回最后一个语句值作为表达式的结果(为什么它与逗号运算符类似)?

Bas*_*tch 15

它不是合法的标准C99,但它是一个非常有用的GCC扩展,称为statement-exprs(以某个表达式结尾的括号括号复合语句).

IIRC,其他一些编译器支持该扩展,例如Clang/LLVM

语句表达式在包含控制流更改和副作用时更有用,例如:

 c = 2*({while (a>0) a--,b--; a+b;});
Run Code Online (Sandbox Code Playgroud)

但是,在您的特定情况下,您可以使用逗号运算符

 if (c=(a+b,b-a))
Run Code Online (Sandbox Code Playgroud)

由于a+b没有任何副作用,我想优化编译器可以处理它

 if (c=b-a)
Run Code Online (Sandbox Code Playgroud)

GCC提供了其他有用的扩展,特别是本地标签使用__label__和标记为带有计算得到的值的值(在线程解释器中非常有用......).我不知道为什么他们没有标准化.我希望他们愿意.