func addOne() -> Bool {
x += 1
print("111")
return true
}
if true || addOne() && addOne() && addOne(){
print("open the door")
} else {
print("can't open the door")
}
我知道逻辑运算符是从左到右计算的,但是在这种情况下不会调用addOne
函数。
所以x
的值是0
,我期望2
如何解决这个逻辑运算符的顺序?
答案 0 :(得分:3)
它称为Short-circuit Evaluation,它表示一旦确定结果,语句就停止评估。仅在知道条件为true或false之前,才对包含&&
或||
运算符的表达式的各部分求值。这样可以加快表达式评估的执行速度。
因此,一旦在表达式中找到true || addOne() && addOne() && addOne()
,就将代码true
称为true
。通常,true || whatever
始终为true,因此无需评估whatever
。
&&
的优先级高于||
,所以:
true || addOne() && addOne() && addOne()
等效于:
true || (addOne() && addOne() && addOne())
我们已经知道true
OR whatever
是正确的,因此whatever
将不会得到评估。
要更改表达式中的默认优先级,请在适合的地方使用括号。例如:
(true || addOne()) && (addOne() && addOne())
在这种情况下,第一个addOne()
不会被求值,但是第二个和第三个会被求值,因为true
AND something
是{{ 1}}。因此,在这种情况下,x将等于2(假设最初x = 0)。
这是最后一个示例(如果您未在评论中告知我,我想您现在就可以了):
something
在这种情况下,if (true || addOne() && addOne()) && addOne()
和true
之间有一个 OR 。在不评估addOne() && addOne()
的情况下,我们已经知道addOne() && addOne()
是true || addOne() && addOne()
。因此,表达式可以简化为true
。在这里,我们必须评估true && addOne()
,这意味着addOne()
将等于x
。
Swift运算符属于优先级组(或级别),用于确定哪个运算符在表达式的求值中具有更高的优先级。优先级越高,优先级越高。
逻辑AND 1
属于 LogicalConjunctionPrecedence 组,该组的优先级高于 LogicalDisjunctionPrecedence 组,逻辑OR {{1} } 属于。因此&&
的优先级比||
高。
答案 1 :(得分:1)
正如@Sulthan所说,&&
运算符的优先级比||
高,因此
true || addOne() && addOne() && addOne()
等效于
true || (addOne() && addOne() && addOne())
然后请注意,布尔运算符是“短路的”:如果左操作数
||
的值等于true
,则完全不计算正确的操作数。
好吧,true
是真的,这就是为什么addOne()
从未被调用的原因。
如果将其更改为
(true || addOne()) && addOne() && addOne()
然后该函数将被调用两次...
有关操作符优先级的更多信息,请参见Operator Declarations。