Swift 运算符优先级和结合性

在本文中,您将了解用于计算带有运算符和操作数的表达式的规则。

Swift运算符优先级

运算符优先级是用于计算给定数学表达式的规则集合。当在单个表达式中使用多个运算符时,每个部分按照称为运算符优先级的特定顺序进行计算。某些运算符具有比其他运算符更高的优先级,这会影响表达式的计算方式。

运算符优先级表

下表列出了Swift中运算符的优先级。它在表格中显示的越高,其优先级越高。

Swift标准库优先级组(从高到低)
运算符组示例
位改变优先级>> &<< &>> >>
乘法运算优先级&* % & * /
加法优先级| &+ &- + –  ^
范围形成优先..< …
类型转换优先级is as
空合运算符优先级??
比较优先级!= > < >= <= === ==
逻辑结合优先级&&
逻辑析取优先级||
默认优先级~>
三元运算符优先级?:
箭头函数优先级( )
赋值优先级|= %= /= &<<= &>>= &= *= >>= <<= ^= += -=

示例1:Swift运算符优先级

let x = 4 + 5 * 5
print(x)

当您运行上述程序时,输出将是:

29

在上面的示例中,如果从左到右读取表达式,则可能期望输出为45。但是,乘法运算符的优先级高于加法运算符,因此表达式4 + 5 * 5被求值为4 + (5 * 5)。因此在屏幕上打印(x)输出29。

执行步骤
步骤
运算符表达式从表达式返回的值
1*5 * 525
2+4 + 2529
3=print(x)29

示例2:具有复杂赋值运算符的Swift运算符优先级

var y = 15
y += 10 - 2 * 3
print(y)

当您运行上述程序时,输出将是:

19

在上面的实例中,变量 y 的表达式 var y = 15赋值为15。

在下一个表达式 y + = 10-2 * 3中,乘法运算符的优先级高于减法复合赋值运算符(+ =)。

因此,表达式 y + = 10-2 * 3 被计算为 y = y + (10-(2 * 3))。

执行步骤
步骤运算符表达式表达式返回的值
1=var y = 1515
2*2 * 36
3--10-64
4+ =15 + 419

Swift运算符关联性

尽管存在由运算符优先级定义的预定义规则来评估表达式,但是您可能想知道如果存在多个相同优先级的运算符会发生什么。 运算符关联性定义了如何将具有相同优先级的运算符组合在一起。

在Swift中,运算符可以是左结合、右结合或没有结合。当在表达式中按顺序使用时,左结合运算符、操作数从语句左侧分组、右侧结合运算符和无关联运算符没有定义的行为。

运算符结合表

下表显示了Swift运算符的结合性及其优先级。

Swift标准库结合(优先级从高到低)
运算符组示例结合性
按位移位优先级>>&<<&>> >>
乘法运算优先级&*%&* /左结合
加法优先级| &+&-+-^左结合

范围形成优先级

.. <...
类型转换优先级is a
空合运算符优先级??右结合
比较优先级!=> <> = <= === ==

逻辑与优先级

&&左结合
逻辑析取优先级||左结合
默认优先级~>
三元运算符优先级?:右结合
箭头函数优先级()右结合
赋值优先级| =%= / =&<< =&>> =&= * = >> = << = ^ =右结合

示例3:Swift运算符结合性

let x =  40  / 2 * 10
print(x)

当您运行上述程序时,输出将是:

200

在上面的程序中,表达式从左到右进行计算,因为运算符属于乘法优先组,并具有左结合性。因此,除法操作会提前执行,结果是200。如果您想先执行乘法运算,该怎么办?需要将2 * 10表达式包装到()大括号中,如下所示:

let x =  40  / (2 * 10)
print(x)

当您运行上述程序时,输出将是:

2

您无需记住优先级和结合表。在大多数情况下,运算符的优先级和结合性本身就是很有意义的。如有疑问,您可以随时使用该表作为参考。另外,最好使用括号使代码更易于理解。