我一直在想,如果我有这样的功能:
bool Foo::Bar()
{
return A() || B() || C();
}
如果A()返回true,Bar()会立即返回true还是在评估最终值之前仍会计算B()和C()的结果?
答案 0 :(得分:8)
如果A()
为真,则不会评估B和C.这称为operator short-circuiting。
同样,在诸如A && B && C
的陈述中,如果A
false ,则不会评估B或C.
这不仅仅是一种优化;当B
或C
依赖A
时,它尤其有用。例如,您既可以测试指针指向某个东西,也可以在单个语句中调用指向该对象的方法:
if (my_pointer && my_pointer->some_method() > 9) {
}
答案 1 :(得分:2)
是的,Bar
会立即返回true
,而不会调用B
或C
,因为||
是short-circuiting运营商。 &&
运算符在其操作数返回false
时也是如此:一旦知道了评估结果,链就会停止。当表达式的第一部分保护第二部分免受潜在错误时,这是必不可少的,例如:
return (ptr == NULL) || ptr -> failed();
如果在发现表达式的初始部分为true
后评估没有停止,则在第二部分中将取消引用NULL
指针,从而导致未定义的行为。
答案 2 :(得分:1)
如果A()返回true,Bar()会立即返回true还是在评估最终值之前仍会计算B()和C()的结果?
都能跟得上!! iff A()
返回true
时,它将不会被执行。
当||
运算符的任何操作数返回true时,不评估其他操作数,因为已知完整表达式的结果。