【问题标题】:What's this C++ syntax that puts a brace-surrounded block where an expression is expected?将大括号包围的块放置在预期表达式的位置的 C++ 语法是什么?
【发布时间】:2011-06-10 10:58:58
【问题描述】:

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

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

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

【问题讨论】:

  • @VJo:我的意思是,这个“({})”结构叫什么?是不是类似于匿名函数?
  • +1 天哪,我以前从未见过这个。太糟糕了,它是 GNU C/C++ 特定的......
  • +1,看起来有点像 lambda 函数 :)
  • 只有我一个人,还是 gcc 中的非标准扩展比其他任何编译器都多?
  • @David 是的,这里挤满了 b*ggers。这就是使用 -pedantic 几乎必不可少的原因。

标签: c++ syntax language-extension gcc-extensions gcc-statement-expression


【解决方案1】:

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

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

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

语句表达式:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我怀疑它获得了如此多的选票,因为很多人在得知他们没有听说过或使用过的东西无论如何都不是标准的东西后松了一口气。
    【解决方案3】:

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

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

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

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

    【讨论】:

    • “({})”有什么具体的名字吗?
    • @Koshimitsu:没有,因为它是运算符的组合(如果您想这样称呼它们)。在这种情况下,大括号 {} 定义了范围的开始 ({) 和结束 (})。常规括号只是用来封装作用域的定义和返回值。我不完全确定在这种情况下是否可以省略这些常规括号,但我希望它们可以。
    • @Koshimitsu:我对 C++ 不是很熟悉,但是在 C 中它是完全合法的,而且我已经用过很多次了。
    • @Neil:嗯,也许是因为 gcc 是我使用的唯一 C 编译器,所以我被误导了。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2010-11-17
      • 2011-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多