逻辑 OR 和逗号运算符是否等效?
Are logical OR and comma operators equivalent?
今天我发现了一个我以前从未见过的语法。||
和,
是一样的吗?
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值,并且不会计算其余参数。
这也是您声称收到的输出错误的原因。
相关文章:
- JS相等运算符(如===)是否可以使用embind类型
- 重载运算符的范围是什么?它是否会影响作为类成员的集合的插入函数?
- 是否所有C++运算符都接受操作数?
- 一元*运算符的操作数是否期望一个 prvalue
- 在 c++ 中是否有办法使用点运算符而不是 -> 来表示 pSomePointer->pValue->nSubvalue
- 是否所有C++运算符都返回一些内容
- 是否可以将带有字符串化运算符的宏转换为 constexpr?
- 我的运算符重载是否有效<<(流插入)左操作数不是 ostream
- C++矢量复制构造函数和赋值运算符是否也复制保留空间?
- 是否允许编译器省略对指针的 &* 运算符的组合调用?
- 检查类是否具有可能重载的函数调用运算符
- 使用 at() 访问 std::map 元素是否比运算符 [] 慢?
- 是否允许三元运算符在C++中计算两个操作数?
- C++:如果我重载新运算符,我是否也必须重载删除运算符?
- 复合赋值运算符是否不如 C++ 精确?
- 预处理器是否可以更改运算符重载功能的符号?
- 矢量擦除方法是否需要类才能具有 = 运算符?
- 如果我也使用复制构造函数并且重载 = 运算符,我是否需要析构函数?
- 基于 SFINAE 的特征,用于确定是否支持运算符 +
- 放置新运算符是否会禁用默认的新运算符?