80

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

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

谁能解释发生了什么?这个结构叫什么?

4

4 回答 4

71

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

语句表达式是gnu gcc 编译器扩展,不受 C/C++ 标准支持。因此,任何使用语句表达式的代码都不符合标准且不可移植。

IBM XL C/C++ v7.0 也支持语句表达式,其文档对它们进行了恰当的解释:

语句表达式:

复合语句是由大括号括起来的语句序列。在 GNU C 中,括号内的复合语句可能以表达式的形式出现在所谓的 aStatement expression中。

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

语句表达式的值是出现在整个构造中的最后一个简单表达式的值。如果最后一条语句不是表达式,则构造是 void 类型并且没有值。

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

于 2011-06-10T11:02:12.937 回答
56

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

于 2011-06-10T11:07:00.270 回答
18

它创建一个内联范围,在其中声明x,从标准输入中读取它,整个语句最终计算为x,分配给a

逗号运算符的工作方式类似,尽管它不需要单独的范围。例如:

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

也会这样做。所有用逗号连接的语句都将按顺序执行,整个表达式的结果将设置为最右边操作数的值。

于 2011-06-10T11:01:42.733 回答
13

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

于 2011-06-10T11:02:31.437 回答