Swift 逻辑运算符短路未按预期工作
Swift short-circuiting with logical operators not working as expected
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)
还要求值并对数组排序?
短路意味着仅当结果已经明确时才不计算表达式的下一部分。如果 &&
之前的部分是 true
那么结果仍然可以是 false
和 true
并且下一部分 必须 评价了。
个案是:
1. true && true => true
2. true && false => false
3. false && false => false
4. false && true => false
在评估左操作数后我们有:
true && ??
可以在情况 1 或情况 2 中结束,结果不同。
另一方面,如果我们有:
false && ??
那么结果将是情况 3 或情况 4,它们都是 false
并且表达式将短路。
AND (&&
) 布尔运算的结果只有在 &&
运算符的两边都为真时才能为真,所以即使第一个操作数为真,第二个操作数仍然需要评估。
仅当您使用 OR 运算符 (||
) 并且其第一个操作数的计算结果为 true
时才会发生短路(导致整个表达式的计算结果为 true
)或者,如果您正在使用 AND 运算符并且其第一个操作数的计算结果为 false
(导致整个表达式的计算结果为 false
)。
由于您在 if
语句中使用了 &&
运算符,因此应该执行 sortAndCheck(array: &anArray)
函数。
如果在if
语句中使用||
运算符,当anArray.contains(3)
为true
时,sortAndCheck(array: &anArray)
不会被执行。
since anArray.contains(3) is already true, why does sortAndCheck(array: &anArray) still get evaluated
因为X
并不意味着X && Y
。如果表达式使用 ||
代替,那么你是对的,第二部分不需要计算。但是 AND 表达式中的两个操作数都必须为真才能使表达式为真。
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)
还要求值并对数组排序?
短路意味着仅当结果已经明确时才不计算表达式的下一部分。如果 &&
之前的部分是 true
那么结果仍然可以是 false
和 true
并且下一部分 必须 评价了。
个案是:
1. true && true => true
2. true && false => false
3. false && false => false
4. false && true => false
在评估左操作数后我们有:
true && ??
可以在情况 1 或情况 2 中结束,结果不同。
另一方面,如果我们有:
false && ??
那么结果将是情况 3 或情况 4,它们都是 false
并且表达式将短路。
AND (&&
) 布尔运算的结果只有在 &&
运算符的两边都为真时才能为真,所以即使第一个操作数为真,第二个操作数仍然需要评估。
仅当您使用 OR 运算符 (||
) 并且其第一个操作数的计算结果为 true
时才会发生短路(导致整个表达式的计算结果为 true
)或者,如果您正在使用 AND 运算符并且其第一个操作数的计算结果为 false
(导致整个表达式的计算结果为 false
)。
由于您在 if
语句中使用了 &&
运算符,因此应该执行 sortAndCheck(array: &anArray)
函数。
如果在if
语句中使用||
运算符,当anArray.contains(3)
为true
时,sortAndCheck(array: &anArray)
不会被执行。
since anArray.contains(3) is already true, why does sortAndCheck(array: &anArray) still get evaluated
因为X
并不意味着X && Y
。如果表达式使用 ||
代替,那么你是对的,第二部分不需要计算。但是 AND 表达式中的两个操作数都必须为真才能使表达式为真。