逻辑运算符无法正常运行的快速短路

时间:2019-01-02 12:09:21

标签: swift syntax short-circuiting

var anArray = [3, 2, 1]
func sortAndCheck(array: inout [Int]) -> Bool{
    array.sort()
    return array.contains(3)
}

if anArray.contains(3){
    print(anArray) // Prints [3, 2, 1]
}

if anArray.contains(3) && sortAndCheck(array: &anArray){
    print(anArray) // Prints [1, 2, 3]
}

对于第二个if语句,由于anArray.contains(3)已经为真,为什么sortAndCheck(array: &anArray)仍然被求值并对anArray排序?enter image description here

4 个答案:

答案 0 :(得分:4)

短路意味着仅当结果已经明确时,才对表达式的下一部分进行求值。如果&&之前的部分是true,那么结果仍然可以同时是falsetrue,并且下一个部分必须进行评估。< / p>

情况是:

1. true && true => true
2. true && false => false
3. false && false => false
4. false && true => false

在评估了左操作数之后,我们得到:

true && ??

可以在情况1或2中结束,结果不同。

另一方面,如果我们有:

false && ??

那么结果将是情况3或4,它们都是false,并且表达式将短路。

答案 1 :(得分:3)

AND(&&)布尔运算的结果只有在&&运算符的两端都为true时才为true,因此即使第一个操作数为true,第二个操作数仍需要被评估。

仅当您使用OR运算符(||)且其第一个操作数的值为true(导致整个表达式的值为true)时,或您正在使用AND运算符,并且其第一个操作数的计算结果为false(导致整个表达式的计算结果为false)。

答案 2 :(得分:1)

由于您在&&语句中使用if运算符,因此应执行sortAndCheck(array: &anArray)函数。

如果在||语句中使用if运算符,则sortAndCheck(array: &anArray)anArray.contains(3)时将不会执行true

答案 3 :(得分:1)

  

由于anArray.contains(3)已经为真,为什么仍然对sortAndCheck(array:&anArray)求值

因为X并不意味着X && Y。如果表达式使用||代替,那么您将是对的,并且第二部分不需要求值。但是AND表达式中的两个操作数都必须为true才能使表达式为真。