C++如何处理&&?(短路求值)

63

当遇到(bool1 && bool2)时,C++是否会尝试检查bool2,如果bool1为假,则忽略它是否像PHP一样?

很抱歉如果这是一个太基础的问题,但我真的在Schildt书籍和互联网上都找不到相关提及。

7个回答

78

是的,C++中的&&运算符使用短路求值,如果bool1评估为false,它就不会评估bool2

“短路求值”是你想要在Google和索引中查找的高级术语。

||运算符也是同样的道理,如果bool1评估为true,整个表达式将评估为true,而不需评估bool2

如果您想要无论如何评估所有表达式,可以使用&|运算符。


短路评估与或 || 如何处理? - user656925
4
|| 运算符也使用短路求值。不同的是,对于表达式 bool1 || bool2,当 bool1 求值为 false 时,会继续对 bool2 进行求值。 - Mr. Deathless
2
“如果您想要无论如何评估所有表达式,可以使用 & 和 | 运算符。” 除非您严格使用 bool 表达式,否则用位运算符 & 和 | 替换逻辑 && 和 || 是不安全的。 由于逻辑运算符可以作用于其他类型,因此不能保证获得可靠的结果。例如: 4 && 2 的计算结果为 true,而 4 & 2 的计算结果为 04 || 2 的计算结果为 true,而 4 | 2 的计算结果为 6。 如果您想强制评估两个表达式并进行逻辑比较,请显式地评估,然后进行比较。 - Fauxcuss
跟随Money47的建议可能更清晰。如果我看到if (foo(x) | bar(y),我的第一个想法不会是“哦,foobar返回bool,但作者想确保它们都被调用了”。而是“好的,foobar似乎返回一组位标志的单词,并且我们在测试在调用它们之后是否设置了任何标志;这看起来有点棘手”。 - Ben

41

C++使用短路逻辑,因此如果bool1为false,则不需要检查bool2

如果bool2实际上是返回bool值的函数或要使用指针,则这是有用的:

if ( pointer && pointer->someMethod() )

如果没有短路逻辑的话,在解引用NULL指针时程序会崩溃,但有了短路逻辑,它就能正常工作。


你能确定 pointerpointer->someMethod() 之前被评估吗? - AdmiralAdama
是的,因为 && 的操作数从左到右进行评估。 - Ajay

19

这是正确的(短路行为)。但请注意:如果调用的操作符不是内置操作符,而是用户定义的operator&&(同样适用于operator||),则短路会停止。

此处参考 SO


1
但是短路计算并不仅限于本地类型。重载转换为bool(或安全bool)而不是operator &&可以很好地解决这个问题。 - Konrad Rudolph
有趣。我不知道这个。你知道标准中定义这个的章节/文本吗? - Macke
1
没错,这个 SO 的参考链接是正确的。我会尝试重新表述我的答案。 - Mat

2
在C++中,&&运算符会短路 - 如果在您的示例中bool1为false,则不会检查/执行bool2

1
这被称为短路求值(维基百科)
在C++中,&&运算符是一个短路运算符,如果bool1为false,则不会评估bool2。

1

短路求值是指某些编程语言中一些布尔运算符的语义,其中仅当第一个参数不足以确定表达式的值时才执行或评估第二个参数:例如,当AND函数的第一个参数计算结果为false时,整个表达式的值必须为false;当OR函数的第一个参数计算结果为true时,整个表达式的值必须为true。

在C++中,&&和||运算符都使用短路求值。


0
你所指的是短路求值。我曾认为这可能是编译器特定的,但我链接的那篇文章表明它是语言特定的,而C++确实遵循这一点。如果它确实是编译器特定的,我无法想象有哪个编译器不会遵循它。目前我每天使用的编译器,VS 2008,也是如此。基本上它将遵循运算符优先级,并且一旦条件结果得到保证,

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接