在本文中,您将了解用于计算带有运算符和操作数的表达式的规则。
运算符优先级是用于计算给定数学表达式的规则集合。当在单个表达式中使用多个运算符时,每个部分按照称为运算符优先级的特定顺序进行计算。某些运算符具有比其他运算符更高的优先级,这会影响表达式的计算方式。
下表列出了Swift中运算符的优先级。它在表格中显示的越高,其优先级越高。
运算符组 | 示例 |
位改变优先级 | >> &<< &>> >> |
乘法运算优先级 | &* % & * / |
加法优先级 | | &+ &- + – ^ |
范围形成优先 | ..< … |
类型转换优先级 | is as |
空合运算符优先级 | ?? |
比较优先级 | != > < >= <= === == |
逻辑结合优先级 | && |
逻辑析取优先级 | || |
默认优先级 | ~> |
三元运算符优先级 | ?: |
箭头函数优先级 | ( ) |
赋值优先级 | |= %= /= &<<= &>>= &= *= >>= <<= ^= += -= |
let x = 4 + 5 * 5 print(x)
当您运行上述程序时,输出将是:
29
在上面的示例中,如果从左到右读取表达式,则可能期望输出为45。但是,乘法运算符的优先级高于加法运算符,因此表达式4 + 5 * 5被求值为4 + (5 * 5)。因此在屏幕上打印(x)输出29。
步骤 | 运算符 | 表达式 | 从表达式返回的值 |
---|---|---|---|
1 | * | 5 * 5 | 25 |
2 | + | 4 + 25 | 29 |
3 | = | print(x) | 29 |
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 = 15 | 15 |
2 | * | 2 * 3 | 6 |
3 | -- | 10-6 | 4 |
4 | + = | 15 + 4 | 19 |
尽管存在由运算符优先级定义的预定义规则来评估表达式,但是您可能想知道如果存在多个相同优先级的运算符会发生什么。 运算符关联性定义了如何将具有相同优先级的运算符组合在一起。
在Swift中,运算符可以是左结合、右结合或没有结合。当在表达式中按顺序使用时,左结合运算符、操作数从语句左侧分组、右侧结合运算符和无关联运算符没有定义的行为。
下表显示了Swift运算符的结合性及其优先级。
运算符组 | 示例 | 结合性 |
---|---|---|
按位移位优先级 | >>&<<&>> >> | 无 |
乘法运算优先级 | &*%&* / | 左结合 |
加法优先级 | | &+&-+-^ | 左结合 |
范围形成优先级 | .. <... | 无 |
类型转换优先级 | is a | 无 |
空合运算符优先级 | ?? | 右结合 |
比较优先级 | !=> <> = <= === == | 无 |
逻辑与优先级 | && | 左结合 |
逻辑析取优先级 | || | 左结合 |
默认优先级 | ~> | 无 |
三元运算符优先级 | ?: | 右结合 |
箭头函数优先级 | () | 右结合 |
赋值优先级 | | =%= / =&<< =&>> =&= * = >> = << = ^ = | 右结合 |
let x = 40 / 2 * 10 print(x)
当您运行上述程序时,输出将是:
200
在上面的程序中,表达式从左到右进行计算,因为运算符属于乘法优先组,并具有左结合性。因此,除法操作会提前执行,结果是200。如果您想先执行乘法运算,该怎么办?需要将2 * 10表达式包装到()大括号中,如下所示:
let x = 40 / (2 * 10) print(x)
当您运行上述程序时,输出将是:
2
您无需记住优先级和结合表。在大多数情况下,运算符的优先级和结合性本身就是很有意义的。如有疑问,您可以随时使用该表作为参考。另外,最好使用括号使代码更易于理解。