假设我在||
运算符的左/右边有两个表达式。我发现如果左表达式为真,则永远不会调用右运算符。例如,在我的下面的代码中,当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;
}
提前谢谢,
林
答案 0 :(得分:10)
是的,这是一项名为short circuit evaluation的保证功能。
同样,表达式false && expression
永远不会评估正确的表达式。
答案 1 :(得分:8)
想知道它是否是我们可以依赖的C ++的可靠特性 - 如果留下||的一部分是真的,右边的部分永远不会被称为?
是的,对于内置运营商。
来自标准的$ 5.15 / 1逻辑OR运算符[expr.log.or](由我粗体显示)
||操作员组从左到右。操作数都是 在上下文中转换为bool(第4条)。如果有的话,它返回true 它的操作数是真的,否则是假的。与|,||不同担保 从左到右的评价;而且,第二个操作数不是 评估第一个操作数是否为真。
请注意operator||
的重载将失去此特殊属性。
Logical operators(我粗体)
内置运营商&amp;&amp;和||进行短路评估(不要 如果在评估后知道结果,则评估第二个操作数 第一个),但重载运算符的行为类似于常规函数 调用并始终评估两个操作数。
答案 2 :(得分:1)
由于它的一个或另一个选择不需要评估第二部分,因此不依赖于平台是一种语言特征。