关于OR(||)运算符和return语句

时间:2012-12-21 13:47:36

标签: c++ operators

我一直在想,如果我有这样的功能:

bool Foo::Bar()
{
     return A() || B() || C();
}

如果A()返回true,Bar()会立即返回true还是在评估最终值之前仍会计算B()和C()的结果?

3 个答案:

答案 0 :(得分:8)

如果A()为真,则不会评估B和C.这称为operator short-circuiting

同样,在诸如A && B && C的陈述中,如果A false ,则不会评估B或C.

这不仅仅是一种优化;当BC依赖A时,它尤其有用。例如,您既可以测试指针指向某个东西,也可以在单个语句中调用指向该对象的方法:

if (my_pointer && my_pointer->some_method() > 9) {

}

答案 1 :(得分:2)

是的,Bar会立即返回true,而不会调用BC,因为||short-circuiting运营商。 &&运算符在其操作数返回false时也是如此:一旦知道了评估结果,链就会停止。当表达式的第一部分保护第二部分免受潜在错误时,这是​​必不可少的,例如:

return (ptr == NULL) || ptr -> failed();

如果在发现表达式的初始部分为true后评估没有停止,则在第二部分中将取消引用NULL指针,从而导致未定义的行为。

答案 2 :(得分:1)

  

如果A()返回true,Bar()会立即返回true还是在评估最终值之前仍会计算B()和C()的结果?

都能跟得上!! iff A()返回true时,它将不会被执行。

||运算符的任何操作数返回true时,不评估其他操作数,因为已知完整表达式的结果。