swift运算符的优先级和结合性 – Swift最新教程

上一章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)

你不需要记住优先级和关联表,大多数情况下,操作符的优先级和结合性本身是有意义的。当有疑问时,你总是可以使用这个表格作为参考。此外,最好使用括号使你的代码更容易理解。

微信公众号
手机浏览(小程序)
0
分享到:
没有账号? 忘记密码?