C / C ++语法 - 用,而不是;分隔语句;法律?

时间:2011-11-16 09:46:53

标签: c++ c syntax separator

我刚碰到这段代码:

delete a, a = 0;

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

delete a;
a = 0;

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

谢谢:)

5 个答案:

答案 0 :(得分:7)

在C和C ++中,大多数“语句”实际上是表达式。添加到表达式中的分号使其成为一个语句。或者,允许(但几乎总是坏的样式)将副作用表达式与逗号运算符分开:左侧表达式的副作用被评估(并且其值被丢弃),右侧表达式被评估。评估-side表达式的值。

答案 1 :(得分:6)

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

答案 2 :(得分:5)

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

答案 3 :(得分:5)

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

答案 4 :(得分:1)

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

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

现在你要遍历struct中的所有内容并运行检查,然后在check返回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);

我不会在没有特别好的理由的情况下使用它,但它确实允许你从条件中调用任何函数,这很方便。