跳到主要内容

Swift 运算符优先级和结合性

提示
  1. 操作符优先级定义:Swift 中操作符优先级规则确定表达式中哪个操作符首先执行,例如乘法 (*) 优先于加法 (+)。
  2. 操作符优先级顺序:不同操作符有不同的优先级,如位移最高,其次是乘法类,再是加法类,最后是赋值运算符。
  3. 操作符结合性规则:当表达式中有相同优先级的操作符时,结合性决定求值顺序,如乘法 (*) 和除法 (/) 为左结合性,表示从左到右计算。

操作符优先级是一组规则,用于确定首先执行哪个操作符。

在学习操作符优先级之前,请确保你了解 Swift 操作符

让我们举个例子,假设一个表达式中有多个操作符。

var num = 8 + 5 * 4 // 28

这里,

  • 如果先执行 +num 的值将是 52
  • 如果先执行 *num 的值将是 28

在这种情况下,操作符优先级用于确定首先执行哪个操作符。* 的操作符优先级高于 +,所以先执行乘法。

操作符优先级表

下表列出了 Swift 操作符的优先级。表中越靠上的操作符,其优先级越高。

操作符示例
位移>> <<
乘法类% * /
加法类+ - ^
范围..< ...
类型转换is as
空合运算符??
比较!= > < >= <= === ==
逻辑与&&
逻辑或||
三元运算符? :
赋值运算符= %= /= *= >>= <<= ^= += -=

示例:带复杂赋值运算符的操作符优先级

var num = 15

num += 10 - 2 * 3
print(num)

输出

19

在上述示例中,我们创建了一个值为 15 的变量 num。注意这个语句

num += 10 - 2 * 3

这里,从高到低的优先级顺序是 *-+=。因此,语句被执行为 num += 10 - (2 * 3)

Swift 操作符结合性

如果一个表达式中有两个优先级相同的操作符,表达式将根据其结合性(从左到右或从右到左)进行求值。例如,

print(6 * 4 / 3)     // 8

这里,操作符 */ 的优先级相同。它们的结合性是从左到右。因此,先执行 6 * 4

注意: 如果我们想先执行除法,我们可以使用括号,如 print(6 * (4 / 3))

操作符结合性表

如果一个表达式中有两个优先级相同的操作符,表达式将根据其结合性进行求值。

  • 左结合性 - 从左到右求值
  • 右结合性 - 从右到左求值
  • 无结合性 - 操作符没有定义的行为

例如,

print (6 * 4 / 3)

这里,操作符 */ 的优先级相同。然而,它们的结合性是左结合。因此,先执行 6 * 4

下表显示了 Swift 操作符的结合性。

| 操作符 | 结合性 | | -------------------------------------------------- | ----------------------------------- | ----- | ---- | | Bitwise Shift : >> << | none | | Multiplicative : % * / | left | | Additive : | + - ^ | left | | Range : ..< ... | none | | Casting : is as | none | | Nil-Coalescing : ?? | right | | Comparison : != > < >= <= === == | none | | Logical AND : && | left | | Logical OR : \|\| | left | | Ternary Operator : ? : | right | | Assignment : \|= %= /= \*= >>= <<= ^= | right |