0

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

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

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

4

3 回答 3

8

如果A()为真,则 B 和 C 都不会被评估。这称为运算符短路

类似地,在诸如A && B && C, if Ais false之类的语句中,B 或 C 都不会被计算。

这不仅仅是优化;B当或C取决于时,它特别有用A。例如,您既可以测试指针是否指向某个对象,也可以在单个语句中调用指向对象的方法:

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

}
于 2012-12-21T13:48:44.043 回答
2

是的,Bar将立即返回true,而不调用Bor C,因为||它是一个短路运算符。&&当操作数返回时,操作符也是如此false:一旦知道评估结果,链就会停止。这在表达式的第一部分保护第二部分免受潜在错误影响的情况下是必不可少的,如下所示:

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

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

于 2012-12-21T13:48:48.667 回答
1

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

没有!!A()如果return根本不会执行它true

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

于 2012-12-21T13:49:48.483 回答