上一章Swift教程请查看:swift操作符,使用语法和使用例子
在本文中,你将了解使用运算符和操作数计算表达式的规则。
Swift运算符优先级
运算符优先级是用于计算给定数学表达式的规则集合。当在单个表达式中使用多个运算符时,每个部分都按称为运算符优先级的特定顺序进行计算。某些操作符具有比其他操作符更高的优先级,这将影响表达式的计算方式。
运算符优先级表
下表列出了Swift中操作符的优先级,它在表中出现的位置越高,它的优先级就越高。
Swift标准库优先组(从高到低)
操作符组 | 例子 |
位改变优先级 |
>> &<< &>> >> |
乘法运算优先级 |
&* % & * / |
添加优先级 |
| &+ &- + – ^ |
范围形成优先 | ..< … |
铸件优先 | is as |
Nil-Coalescing优先 | ?? |
比较优先级 |
!= > < >= <= === == |
逻辑结合优先级 | && |
逻辑析取优先级 | || |
默认优先级 | ~> |
三元优先 | ?: |
箭头函数优先级 | ( ) |
赋值优先级 |
|= %= /= &<<= &>>= &= *= >>= <<= ^= += -= |
例1:Swift操作符优先级
let x = 4 + 5 * 5
print(x)
在上面的例子中,如果从左到右读取表达式,那么输出可能是45。但是,乘法运算符具有比加法运算符更高的优先级,因此表达式4 + 5 * 5被赋值为4 +(5 * 5),因此在屏幕上打印(x)输出29。
执行步骤
步长 | 操作符 | 表达式 | 表达式返回的值 |
1 | * | 5 * 5 | 25 |
2 | + | 4 + 25 | 29 |
3 | = | print(x) | 29 |
例2:快速运算符优先级与复杂赋值运算符
var y = 15
y += 10 - 2 * 3
print(y)
在上面的例子中,表达式var
y = 15在变量y中赋值15。
在下一个表达式y +=
10 – 2 * 3中,乘法运算符的优先级高于减法和复合赋值运算符(+=)。
因此,表达式y +=
10 – 2 * 3的取值为y = y +(10 -(2 * 3))。
执行步骤
步长 | 操作符 | 表达式 | 表达式返回的值 |
1 | = | var y = 15 | 15 |
2 | * | 2 * 3 | 6 |
3 | – | 10 – 6 | 4 |
4 | += | 15 + 4 | 19 |
Swift操作符的结合性
虽然有由运算符优先级定义的预定义规则来计算表达式,但是你可能想知道如果有多个具有相同优先级的运算符会发生什么,操作符结合性定义了如何将具有相同优先级的操作符组合在一起。
在Swift中,操作符可以是左结合的,右结合的,也可以是无结合的。左关联操作符,从语句的左侧对操作数进行分组,从右侧对右关联操作符进行分组,以及没有关联的操作符在表达式中按顺序使用时没有定义行为。
操作符结合性表
下表显示了Swift操作符的结合性和优先级。
Swift标准库结合性(从高到低的优先级)
操作符组 | 例子 | 结合性 |
位改变优先级 |
>> &<< &>> >> |
none |
乘法运算优先级 |
&* % & * / |
左 |
添加优先级 |
| &+ &- + – ^ |
左 |
范围形成优先 | ..< … | none |
转换优先 | is as | none |
Nil-Coalescing优先 | ?? | 右 |
比较优先级 |
!= > < >= <= === == |
none |
逻辑结合优先级 | && | 左 |
逻辑析取优先级 | || | 左 |
默认优先级 | ~> | none |
三元优先 | ?: | 右 |
箭头函数优先级 | ( ) | 右 |
分配优先级 |
|= %= /= &<<= &>>= &= *= >>= <<= ^= |
右 |
例3:Swift操作符的结合性
let x = 40 / 2 * 10
print(x)
在上面的程序中,表达式是从左到右求值的,因为运算符属于乘法优先组,并且具有左结合性。因此,除法运算更早发生,结果是200。如果你想先执行乘法呢?你需要把2 * 10的表达式包装成()大括号:
let x = 40 / (2 * 10)
print(x)
你不需要记住优先级和关联表,大多数情况下,操作符的优先级和结合性本身是有意义的。当有疑问时,你总是可以使用这个表格作为参考。此外,最好使用括号使你的代码更容易理解。