【问题标题】:C/C++ Syntax - Separating statements with , instead of ; legal?C/C++ 语法 - 用 , 而不是 ; 分隔语句合法的?
【发布时间】:2011-11-16 09:46:52
【问题描述】:

我刚刚遇到了执行此操作的这段代码:

delete a, a = 0;

它编译并运行得很好。但这不应该是:

delete a;
a = 0;

为什么在这种情况下允许使用 , 分隔语句?

谢谢:)

【问题讨论】:

标签: c++ c syntax separator


【解决方案1】:

在 C 和 C++ 中,大多数“语句”实际上是表达式。添加到表达式的分号使其成为语句。或者,允许(但几乎总是不好的风格)用逗号运算符分隔有副作用的表达式:左边的表达式被评估它的副作用(并且它的值被丢弃),右边的表达式-side 表达式对其值进行评估。

【讨论】:

    【解决方案2】:

    这是逗号运算符。它评估它的两个参数并返回第二个。

    【讨论】:

      【解决方案3】:

      这是逗号运算符。它可以用来分隔表达式,但不能用来分隔声明。

      【讨论】:

      • 可以用逗号引入多个相同类型的声明。
      【解决方案4】:

      那是comma operator。 MSDN 文章是here。并查看this 问题以了解其工作原理。

      【讨论】:

        【解决方案5】:

        虽然可以编写这样的代码,但可能有点奇怪。如果您有一个结构 T 如下所示,则更实际的用例是:

        struct T {
            bool check() const;
            void fix();
        };
        

        现在您要遍历结构中的所有内容并对其运行检查,如果检查返回 false,则调用 fix。这样做的简单方法是

        for (list<T>::iterator it = mylist.begin(); it < mylist.end(); ++it)
             if (!it->check())
                 it->fix();
        

        让我们假设你想用尽可能短的方式来写它。 fix() 返回 void 意味着您不能只将其置于条件中。但是,使用逗号运算符可以解决这个问题:

        for (auto it = mylist.begin(); it != mylist.end() && (it->check() || (it->fix(), true)); ++it);
        

        如果没有特别好的理由,我不会使用它,但它确实允许您从条件调用任何函数,这很方便。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-10-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多