【问题标题】:Swift short-circuiting with logical operators not working as expectedSwift 短路与逻辑运算符未按预期工作
【发布时间】:2019-05-29 02:06:50
【问题描述】:
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) 仍然会被求值并排序一个数组?

【问题讨论】:

  • 通过短路执行,你的代码相当于if anArray.contains(3) { if sortAndCheck(array: &anArray) { print(anArray) } }。由于anArray.contains(3) 的计算结果为true,因此将计算sortAndCheck(array: &anArray) 的返回值。假设 true && x 总是 true 是错误的。
  • && 可以短路如果左边是false

标签: swift syntax short-circuiting


【解决方案1】:

既然 anArray.contains(3) 已经为真,为什么 sortAndCheck(array: &anArray) 仍然被评估

因为X 并不暗示X && Y。如果表达式使用 || 代替,那么你是对的,第二部分不需要评估。但是 AND 表达式中的两个操作数都必须为真,表达式才能为真。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      AND (&&) 布尔运算的结果只有在 && 运算符的两边都为真时才能为真,因此即使第一个操作数为真,第二个操作数仍然需要计算。

      只有在您使用 OR 运算符 (||) 并且其第一个操作数的计算结果为 true(导致整个表达式的计算结果为 true)或使用 AND 运算符时,才会发生短路并且它的第一个操作数计算为false(导致整个表达式计算为false)。

      【讨论】:

      • 在第三种情况下执行快捷方式:可选链接
      • @Carpsen90 你是对的,但这与布尔运算符无关,这个问题是关于
      【解决方案4】:

      短路意味着只有当结果已经清楚时才计算表达式的下一部分。如果&& 之前的部分是true,那么结果仍然可以是falsetrue,并且下一部分必须进行评估。

      案例是:

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

      在评估左操作数之后,我们有:

      true && ??
      

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

      另一方面,如果我们有:

      false && ??
      

      那么结果将是 case 3 或 case 4,它们都是 false,表达式会短路。

      【讨论】:

        猜你喜欢
        • 2021-08-19
        • 2013-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-04
        相关资源
        最近更新 更多