C++如何处理&&?(短路评估)

Ale*_*lme 45 c++ short-circuiting and-operator logical-and

当遇到(bool1 && bool2)时,如果发现bool1为false,c ++是否会尝试检查bool2,或者它是否像PHP那样忽略它?

对不起,如果它是一个问题的基础,但我真的无法在Schildt或互联网上找到这一点.

jas*_*son 56

是的,&&C++中的运算符使用短路评估,因此如果bool1对其进行评估,false则无需进行评估bool2.

"短路评估"是您希望Google在索引中查找的奇特术语.

  • `||'运算符也使用短路评估.区别在于给出一个表达式`bool1 || bool2`,当`bool1`评估为'false`时,那么`bool2`也将被评估. (3认同)
  • > "_如果您想计算所有表达式,您可以使用 & 和 | 运算符。_" 用按位运算符 & 和 | 替换逻辑 && 和 ||。除非您严格使用“bool”表达式,否则是不安全的。由于逻辑运算符可以作用于其他类型,因此不能保证您获得可靠的结果。例如:“4 && 2”的计算结果为“true”,而“4 & 2”的计算结果为“0”。`4 || 2` 计算结果为 true,而 4 | 2` 的计算结果为“6”。如果要强制对两个表达式进行求值并进行逻辑比较,请显式求值,然后进行比较。 (2认同)

Tim*_*Tim 30

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

如果bool2实际上是一个返回bool或使用指针的函数,这很有用:

if ( pointer && pointer->someMethod() )
Run Code Online (Sandbox Code Playgroud)

没有短路逻辑,它会在取消引用NULL指针时崩溃,但是使用短路逻辑,它可以正常工作.


Mat*_*Mat 16

这是正确的(短暂的行为).但要注意:如果调用的操作符不是内置操作符,而是用户定义的operator&&(与之相同operator||),则短路停止.

参考此SO