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

Are logical OR and comma operators equivalent?

本文关键字:是否 运算符 OR 逻辑      更新时间:2023-10-16

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

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 ||

它们是完全相同的东西还是有什么小区别?

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

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

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

this(逗号运算符)

if(f(),g())

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

逻辑 OR 运算符

if(f()||g())

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

因此,即使在某些情况下您可能会看到相同的整体行为,它们也根本不相同。

  • ||是逻辑 OR 运算符,按照标准,它遵循短路计算(即,如果第一个操作数已经足以确定整个逻辑表达式,它不会计算第二个操作数)

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

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

fgOK with ,
fOK with ||

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

http://ideone.com/8dSFiY

它们是完全不同的运算符,用于完全不同的目的。

主要区别在于:

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

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