【问题标题】:swift Logical Operators orderlyswift 逻辑运算符有序
【发布时间】:2018-09-10 08:45:04
【问题描述】:
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 如何解决这个逻辑运算符顺序?

【问题讨论】:

  • 你想达到什么目的?
  • if true || 之后的任何内容都会被忽略。
  • 还要注意&& 的优先级高于||。你的情况意味着true || (addOne() && addOne() && addOne())
  • 我还想知道如果您(尝试)将 x 增加 3 次,为什么您期望它为 2。

标签: swift


【解决方案1】:

它被称为Short-circuit Evaluation,这意味着一旦确定结果,语句就会停止评估。包含&&|| 运算符的表达式部分仅在知道条件是真还是假之前才被计算。这加快了表达式求值的执行速度。

因此,只要您在表达式中找到true,就知道在您的代码中true || addOne() && addOne() && addOne()true。通常true || whatever 将始终为真,因此无需评估whatever

&& 优先于 || 所以:

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

相当于:

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

而且我们已经知道 true OR whatever 为真,因此不会评估 whatever

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

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

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

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

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

在这种情况下,trueaddOne() && addOne() 之间存在 OR。如果不评估addOne() && addOne(),我们已经知道true || addOne() && addOne()true。所以表达式可以简化为true && addOne()。这里我们必须计算addOne(),这意味着x 将等于1


编辑

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

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

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

【讨论】:

  • 谢谢我发现 && 运算符的优先级高于 ||在 Swift 文档中
  • 非常感谢
【解决方案2】:

正如@Sulthan 所说,&& 运算符的优先级高于||,所以

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

等价于

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

然后注意布尔运算符是“短路的”:如果左操作数 || 的计算结果为 true,则根本不计算正确的操作数。 好吧,true 是真的,这就是为什么永远不会调用 addOne()

如果你改成

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

那么函数会被调用两次...

有关运算符优先级的更多信息,请参阅Operator Declarations

【讨论】:

  • 谢谢我发现 && 运算符的优先级高于 ||在 Swift 文档中
猜你喜欢
  • 1970-01-01
  • 2020-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-08
  • 2011-09-23
  • 2011-08-25
相关资源
最近更新 更多