我一直在想,如果我有这样的功能:
bool Foo::Bar()
{
return A() || B() || C();
}
如果 A() 返回 true,Bar() 会立即返回 true,还是会在评估最终值之前计算 B() 和 C() 的结果?
如果A()
为真,则 B 和 C 都不会被评估。这称为运算符短路。
类似地,在诸如A && B && C
, if A
is false之类的语句中,B 或 C 都不会被计算。
这不仅仅是优化;B
当或C
取决于时,它特别有用A
。例如,您既可以测试指针是否指向某个对象,也可以在单个语句中调用指向对象的方法:
if (my_pointer && my_pointer->some_method() > 9) {
}
是的,Bar
将立即返回true
,而不调用B
or C
,因为||
它是一个短路运算符。&&
当操作数返回时,操作符也是如此false
:一旦知道评估结果,链就会停止。这在表达式的第一部分保护第二部分免受潜在错误影响的情况下是必不可少的,如下所示:
return (ptr == NULL) || ptr -> failed();
如果在发现表达式的初始部分是 之后评估没有停止,则true
指针NULL
将在第二部分被取消引用,从而导致未定义的行为。
如果 A() 返回 true,Bar() 会立即返回 true,还是会在评估最终值之前计算 B() 和 C() 的结果?
没有!!A()
如果return根本不会执行它true
。
当 operator 的任何操作数||
返回 true 时,不会评估其他操作数,因为完整表达式的结果是已知的。