a
-检查是否为功能b
定义了输入
if (a) {
if (b) {
/* ... */
}
}
显然有效。
&&
运算符是否总是检查第一个输入?
if (a && b) {
/* ... */
}
这是否可能导致b函数的不确定行为?
答案 0 :(得分:2)
是的,内置&&
短路。
因此,如果a
为假,将不评估b
。除非有operator&&(type of a, type of b)
的过载,否则这是可以保证的。
答案 1 :(得分:0)
在表达式a && b
中,假设&&
是内置运算符,而不是重载运算符,则b
仅在{{1} }的值为a
。
这就是为什么您可以编写诸如true
之类的东西的原因。
我们将此称为短路。 if (a != nullptr && *a)
也具有该属性。
答案 2 :(得分:0)
正如Bathsheba所说,如果您的代码是
if (a && b) {
//...
}
然后,仅当结果为true时才检查b。 这是因为&&运算符是所谓的快捷键运算符。 逻辑或(||)也是如此。
if (a || b)//...
但是,在这种情况下,仅当结果为假时才对b求值。
请勿将这些与按位运算符(&和|)混淆,后者会同时检查两个值。