什么是这个C + +的语法,把一个括号包围的块放在一个expression式的位置?

我遇到了这个奇怪的C ++程序。

#include <iostream> using namespace std; int main() { int a = ({int x; cin >> x; x;}); cout << a; } 

任何人都可以解释发生了什么事? 这个结构叫做什么?

它将用户input值分配给a并打印出来。 它是通过使用Statement Expression

语句expression式是gnu gcc编译器扩展不被C / C ++标准支持。 因此,任何使用语句expression的代码都是非标准的,不可移植的。

IBM IBM XL C / C ++ v7.0也支持Statement Expressions和它的文档恰当地解释它们:

声明expression式:

复合语句是由大括号括起来的一系列语句。 在GNU C中,括号内的复合语句可能会作为一个expression式出现在所谓的Statement expression

  .--------------. V | >>-(--{----statement--;-+--}--)-------------------------------->< 

语句expression式的值是在整个结构中出现的最后一个简单expression式的值。 如果最后一个语句不是一个expression式,那么这个结构的types是void,并且没有值。

总是通过在GCC中select一个标准来编译你的代码,使用选项-ansi-std=c90-std=iso9899:1990-std=c++03-std=c++0x ; 要获得标准所需的所有诊断,还应该指定-pedantic (或-pedantic-errors如果您希望它们是错误而不是警告)

这是一个GCC扩展。 如果你想摆脱像这样的东西(你真的想这样做 ),用-pedantic标志编译你的代码。

它创build一个内联作用域,在其中声明x ,从标准input中读取它,整个语句最终评估为x ,它被分配给a

逗号运算符类似地工作,虽然它不需要单独的作用域。 例如:

 int x; int a = (cin >> x, x); 

会做同样的事情。 所有与逗号连接的语句将被顺序执行,整个expression式的结果将被设置为最右边的操作数的值。

我不相信这是标准的C ++。 这可能是一个特定于编译器的扩展,它允许内部作用域评估为一个值。