逻辑OR和逗号运算符是否等效?

时间:2014-01-04 12:56:17

标签: c++ operators comma-operator

今天我找到了一个我以前从未见过的语法。 ||,是否相同?

bool f() {

    cout << "f";
    return true;
}

bool g() {

    cout << "g";
    return true;
}

int main() {


    if(f(),g())
    {
        cout<<"OK with ,";
    }

    cout<<endl;

    if(f()||g())
    {

        cout<<"OK with ||";
    }

    return 0;
}

从这个程序的输出来看,似乎是这样:

fgOK with ,
fOK with ||

它们是完全相同的还是有什么不同?

4 个答案:

答案 0 :(得分:4)

f(),g()表示评估f(),然后评估g()并返回g(),因为您的g()返回true,这是返回{的内容{1}}

所以,不,运营商完全不同。

如果您修改函数以从if返回false,则可以看到差异。条件g()仍将评估为f()||g()true将返回f(),g()

答案 1 :(得分:3)

这个(逗号运算符)

if(f(),g())

将同时评估f()g()并返回第二个操作数的值g()

逻辑OR运算符

if(f()||g())
如果g()评估为true,则

不会评估f()。这被称为short-circuit evaluation - 如果f()返回true,则逻辑OR条件已经满足 - 因此没有评估g()的点。

因此,即使在某些条件下,您可能会看到相同的整体行为,但它们完全相同。

答案 2 :(得分:2)

它们是完全不同的运营商,服务于完全不同的目的。

主要区别在于:

  • ,运算符(除非超载)将评估其所有参数并返回最后一个参数,无论如何。
  • ||运算符将评估所有参数,直到达到第一个true ish值,并且不会评估其余参数。

这也是您声称要接收的输出is wrong

的原因

答案 3 :(得分:2)

  • || 是逻辑OR运算符,按标准它跟随short-circuit evaluation(即如果第一个已经足以确定整个逻辑,它将不会计算第二个操作数表达)

  • 是逗号运算符,它会对两者进行求值,但只返回第二个操作数的值。

顺便说一下,你应该看到类似的东西:

fgOK with ,
fOK with ||

您没有看到它的原因可能是因为您使用的编译器并未严格遵循标准(我怀疑是MSVC ..)

http://ideone.com/8dSFiY