今天我找到了一个我以前从未见过的语法。 ||
和,
是否相同?
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 ||
它们是完全相同的还是有什么不同?
答案 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 ..)