今天我发现了一个我以前从未见过的语法。||
和,
是一样的吗?
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
它们是完全不同的运算符,用于完全不同的目的。
主要区别在于:
- 无论如何,
,
运算符(除非重载)将计算其所有参数并返回最后一个参数。 ||
运算符将计算所有参数,直到它达到第一个true
ish值,并且不会计算其余参数。
这也是您声称收到的输出错误的原因。