迅速有序的逻辑运算符

时间:2018-09-10 08:45:05

标签: swift

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如何解决这个逻辑运算符的顺序?

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} } 属于。因此&&的优先级比||高。

要了解有关运算符优先级组/级别的更多信息,请直接查看thisthat的底部。

答案 1 :(得分:1)

正如@Sulthan所说,&&运算符的优先级比||高,因此

 true || addOne() && addOne() && addOne()

等效于

true || (addOne() && addOne() && addOne())

然后请注意,布尔运算符是“短路的”:如果左操作数 ||的值等于true,则完全不计算正确的操作数。 好吧,true是真的,这就是为什么addOne()从未被调用的原因。

如果将其更改为

(true || addOne()) && addOne() && addOne()

然后该函数将被调用两次...

有关操作符优先级的更多信息,请参见Operator Declarations