这个C++语法是什么将括号包围的块放在需要表达式的位置?

Kos*_*tsu 76 c++ syntax language-extension gcc-extensions

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

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

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

Alo*_*ave 65

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

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

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

声明表达:

复合语句是由大括号括起来的一系列语句.在GNU C中,括号内的复合语句可能在所谓的a中表示为表达式Statement expression.

         .--------------.
         V              |
>>-(--{----statement--;-+--}--)--------------------------------><
Run Code Online (Sandbox Code Playgroud)

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

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


小智 54

这是GCC扩展.编译的代码-pedantic,如果你想摆脱这样的东西(你真的国旗想).

  • 我怀疑它获得了如此多的选票,因为很多人在得知他们没有听说过或使用过的东西之后都感到松了一口气. (10认同)

Bla*_*iev 18

它创建一个内联作用域,x在其中声明,从标准输入中读取它,并将整个语句最终求值为x,分配给它a.

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

int x;
int a = (cin >> x, x);
Run Code Online (Sandbox Code Playgroud)

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

  • 正如其他帖子所示,它在C中并非"完全合法". (6认同)

Oli*_*rth 13

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

  • @Doc你错了.它不是标准的C++而不是标准C.它是一个名为"语句表达式"的GCC扩展. (13认同)
  • @mathepic:GCC显然都没有(没有正确的选项),因此这里的问题和困惑...... (3认同)