假设我有两个表达式左/右的||
运算符.我发现如果左表达式为真,则永远不会调用右运算符.例如,在我的下面的代码中,当getRand
返回true时,我发现Foo
永远不会被调用.我在Mac OSX上的XCode上进行了测试,并想知道它是否是我们可以依赖的C++的可靠特性 - 如果留下部分|| 是真的,右边的部分永远不会被调用,或者它只是特定平台的特殊功能(例如带有XCode的OSX)?在下面发布我的代码,谢谢.
bool Foo() { std::cout << "I am called!\n"; return false; } bool getRand() { int random_variable = std::rand(); std::cout << random_variable << '\n'; return random_variable % 2 == 1; } int main(int argc, const char * argv[]) { if (getRand() || Foo()) { std::cout<<"Hello World \n"; } return 0; }
林先生,提前谢谢
是的,它是一种称为短路评估的保证功能.
同样,表达式 false && expression
永远不会评估正确的表达式.
想知道它是否是我们可以依赖的C++的可靠特性 - 如果留下||的一部分 是真的,右边的部分永远不会被称为?
是的,对于内置运营商.
从标准,$ 5.15/1逻辑OR运算符[expr.log.or](由我粗体)
|| 操作员组从左到右.操作数都在上下文中转换为bool(第4条).如果其任一操作数为true,则返回true,否则返回false.与|,||不同 保证从左到右的评估; 此外,如果第一个操作数的计算结果为true,则不计算第二个操作数.
请注意,超载operator||
将失去这个特殊属性.
逻辑运算符(由我粗体)
内置运营商&&和|| 执行短路评估(如果在评估第一个操作数后,如果结果已知,则不评估第二个操作数),但是重载操作符的行为类似于常规函数调用,并且总是评估两个操作数.