快速有序的逻辑运算符

1 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")
}
Run Code Online (Sandbox Code Playgroud)

我知道逻辑运算符是从左到右计算的,但在这种情况下,addOne在这种情况下不会调用函数。

所以x值是0和我预期的2如何解决这个逻辑运算符顺序?

iel*_*ani 6

这称为短路评估,意味着一旦确定结果,语句就停止评估。&&仅对包含or运算符的表达式部分||进行求值,直到\xe2\x80\x99s 知道条件是真还是假。这加快了表达式求值的执行速度。

\n\n

因此,只要您在表达式中找到,true || addOne() && addOne() && addOne()就知道在您的代码中。一般来说总是如此,所以没有必要评价。truetruetrue || whateverwhatever

\n\n

&&优先于||so :

\n\n
true || addOne() && addOne() && addOne()\n
Run Code Online (Sandbox Code Playgroud)\n\n

相当于:

\n\n
true || (addOne() && addOne() && addOne())\n
Run Code Online (Sandbox Code Playgroud)\n\n

我们已经知道true OR whatever为真,所以whatever不会被评估。

\n\n

要更改表达式中的默认优先级,请在您认为合适的地方使用括号。例如:

\n\n
(true || addOne()) && (addOne() && addOne())\n
Run Code Online (Sandbox Code Playgroud)\n\n

在这种情况下,第一个addOne()不会被评估,但第二个和第三个将会被评估,因为true AND somethingsomething。因此,在这种情况下,x 将等于 2(假设最初 x = 0)。

\n\n

这是最后一个例子(我想你现在已经明白了,如果没有在评论中告诉我):

\n\n
if (true || addOne() && addOne())   &&   addOne()\n
Run Code Online (Sandbox Code Playgroud)\n\n

在这种情况下,和之间有一个OR。无需评估我们就已经知道了。所以表达式可以简化为. 这里我们必须评估,这意味着,将等于trueaddOne() && addOne()addOne() && addOne()true || addOne() && addOne()truetrue && addOne()addOne()x1

\n\n
\n\n

编辑

\n\n

Swift 运算符属于优先级组(或级别),用于决定哪个操作在表达式求值中具有更高优先级。优先级越高意味着优先级越高。

\n\n

逻辑 AND&&属于LogicalConjunctionPrecedence组,该组的优先级高于逻辑 OR所属的LogicalDisjunctionPrecedence||组。因此&&||

\n\n

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

\n