当遇到(bool1 && bool2)时,C++是否会尝试检查bool2,如果bool1为假,则忽略它是否像PHP一样?
很抱歉如果这是一个太基础的问题,但我真的在Schildt书籍和互联网上都找不到相关提及。
当遇到(bool1 && bool2)时,C++是否会尝试检查bool2,如果bool1为假,则忽略它是否像PHP一样?
很抱歉如果这是一个太基础的问题,但我真的在Schildt书籍和互联网上都找不到相关提及。
是的,C++中的&&
运算符使用短路求值,如果bool1
评估为false
,它就不会评估bool2
。
“短路求值”是你想要在Google和索引中查找的高级术语。
||
运算符也是同样的道理,如果bool1
评估为true
,整个表达式将评估为true,而不需评估bool2
。
如果您想要无论如何评估所有表达式,可以使用&
和|
运算符。
C++使用短路逻辑,因此如果bool1
为false,则不需要检查bool2
。
如果bool2实际上是返回bool值的函数或要使用指针,则这是有用的:
if ( pointer && pointer->someMethod() )
如果没有短路逻辑的话,在解引用NULL指针时程序会崩溃,但有了短路逻辑,它就能正常工作。
pointer
在 pointer->someMethod()
之前被评估吗? - AdmiralAdama&&
的操作数从左到右进行评估。 - Ajay这是正确的(短路行为)。但请注意:如果调用的操作符不是内置操作符,而是用户定义的operator&&
(同样适用于operator||
),则短路会停止。
operator &&
可以很好地解决这个问题。 - Konrad Rudolph&&
运算符会短路 - 如果在您的示例中bool1
为false,则不会检查/执行bool2
。短路求值是指某些编程语言中一些布尔运算符的语义,其中仅当第一个参数不足以确定表达式的值时才执行或评估第二个参数:例如,当AND函数的第一个参数计算结果为false时,整个表达式的值必须为false;当OR函数的第一个参数计算结果为true时,整个表达式的值必须为true。
在C++中,&&和||运算符都使用短路求值。
||
运算符也使用短路求值。不同的是,对于表达式bool1 || bool2
,当bool1
求值为false
时,会继续对bool2
进行求值。 - Mr. Deathlessbool
表达式,否则用位运算符 & 和 | 替换逻辑 && 和 || 是不安全的。 由于逻辑运算符可以作用于其他类型,因此不能保证获得可靠的结果。例如:4 && 2
的计算结果为true
,而4 & 2
的计算结果为0
。4 || 2
的计算结果为true
,而4 | 2
的计算结果为6
。 如果您想强制评估两个表达式并进行逻辑比较,请显式地评估,然后进行比较。 - Fauxcussif (foo(x) | bar(y)
,我的第一个想法不会是“哦,foo
和bar
返回bool
,但作者想确保它们都被调用了”。而是“好的,foo
和bar
似乎返回一组位标志的单词,并且我们在测试在调用它们之后是否设置了任何标志;这看起来有点棘手”。 - Ben