-6

今天我发现了一个我以前从未见过的语法。||,一样吗?

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

4 回答 4

4

f(),g()意味着评估f()然后评估g()并返回g(),因为您的g()回报true是返回的内容if

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

如果您将函数修改为falseg(). 条件f()||g()仍将评估为truewhilef(),g()将返回false

于 2014-01-04T12:57:43.710 回答
3

这(逗号运算符)

if(f(),g())

将同时计算f()andg()并返回第二个操作数的值g()

逻辑 OR 运算符

if(f()||g())

g()如果f()评估为真,则不会评估。这称为短路评估- 如果 f() 返回 true,则逻辑 OR 条件已经满足 - 因此没有意义评估g()

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

于 2014-01-04T12:59:54.093 回答
2

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

主要区别在于:

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

这也是您声称收到的输出错误的原因。

于 2014-01-04T13:01:23.300 回答
2
  • || 是逻辑或运算符,按照标准,它遵循短路评估(即,如果第一个操作数已经足以确定整个逻辑表达式,它将不会评估第二个操作数)

  • ,是一个逗号运算符,它计算两者,但只返回第二个操作数的值。

顺便说一句,您应该会看到如下内容:

fgOK with ,
fOK with ||

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

http://ideone.com/8dSFiY

于 2014-01-04T13:03:55.000 回答