原文: https://www.programiz.com/swift-programming/operator-precedence-associativity

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

Swift 运算符优先级

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


运算符优先级表

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

Swift Standard Library Precedence Groups (Highest to Lowest)

运算符分组 例子
按位移位优先级 `& ^ ~ >> << >>>`
乘法优先级 * % /
加法优先级 + - + -
范围优先级 ..< ...
转换优先级 as
NIL 推断优先级 ??
比较优先级 != > < >= <= === ==
逻辑合取优先级 &&
逻辑析取优先级 ` `
默认优先级 ~>
三元优先级 ?:
函数箭头优先级 ()
赋值优先级 ` = %= /= <<= >>= &= *= >>= <<= ^= += -=`

示例 1:Swift 运算符优先级

  1. let x = 4 + 5 * 5
  2. print(x)

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

  1. 29

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

执行步骤

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

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

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

运行该程序时,输出为:

  1. 19

在上面的示例中,表达式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 Standard Library Associativity (Precedence Highest to Lowest)

运算符分组 例子 关联性
按位移位优先级 `& ^ ~ >> << >>>`
乘法优先级 * % /
加法优先级 + - + -
范围优先级 ..< ...
转换优先级 as
NIL 推断优先级 ??
比较优先级 != > < >= <= === ==
逻辑合取优先级 &&
逻辑析取优先级 ` `
默认优先级 ~>
三元优先级 ?:
函数箭头优先级 ()
赋值优先级 ` = %= /= <<= >>= &= *= >>= <<= ^= += -=`

示例 3:Swift 运算符关联性

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

运行该程序时,输出为:

  1. 200

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

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

运行该程序时,输出为:

  1. 2

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