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如何解决这个逻辑运算符顺序?
这称为短路评估,意味着一旦确定结果,语句就停止评估。&&仅对包含or运算符的表达式部分||进行求值,直到\xe2\x80\x99s 知道条件是真还是假。这加快了表达式求值的执行速度。
因此,只要您在表达式中找到,true || addOne() && addOne() && addOne()就知道在您的代码中。一般来说总是如此,所以没有必要评价。truetruetrue || whateverwhatever
&&优先于||so :
true || addOne() && addOne() && addOne()\nRun Code Online (Sandbox Code Playgroud)\n\n相当于:
\n\ntrue || (addOne() && addOne() && addOne())\nRun Code Online (Sandbox Code Playgroud)\n\n我们已经知道true OR whatever为真,所以whatever不会被评估。
要更改表达式中的默认优先级,请在您认为合适的地方使用括号。例如:
\n\n(true || addOne()) && (addOne() && addOne())\nRun Code Online (Sandbox Code Playgroud)\n\n在这种情况下,第一个addOne()不会被评估,但第二个和第三个将会被评估,因为true AND something是something。因此,在这种情况下,x 将等于 2(假设最初 x = 0)。
这是最后一个例子(我想你现在已经明白了,如果没有在评论中告诉我):
\n\nif (true || addOne() && addOne()) && addOne()\nRun Code Online (Sandbox Code Playgroud)\n\n在这种情况下,和之间有一个OR。无需评估我们就已经知道了。所以表达式可以简化为. 这里我们必须评估,这意味着,将等于trueaddOne() && addOne()addOne() && addOne()true || addOne() && addOne()truetrue && addOne()addOne()x1。
Swift 运算符属于优先级组(或级别),用于决定哪个操作在表达式求值中具有更高优先级。优先级越高意味着优先级越高。
\n\n逻辑 AND&&属于LogicalConjunctionPrecedence组,该组的优先级高于逻辑 OR所属的LogicalDisjunctionPrecedence||组。因此&&比||。
要了解有关运算符优先级组/级别的更多信息,请查看this或 that的底部的底部。
\n| 归档时间: |
|
| 查看次数: |
1275 次 |
| 最近记录: |