Swift运算符优先级
运算符优先级是用于评估给定数学表达式的规则的集合。当在单个表达式中使用多个运算符 ,将按称为运算符优先级的特定顺序评估每个部分。某些运算符的优先级高于其他运算符 ,这会影响表达式的求值方式。
运算符优先级表
下表列出了Swift中运算符的优先级。它在表格中显示的越高,其优先级越高。
Operator Groups | Examples |
---|---|
Bitwise shift precedence | >> &<< &>> >> |
Multiplication precedence | &* % & * / |
Addition precedence | | &+ &- + – ^ |
Range Formation Precedence | ..< … |
Casting Precedence | is as |
Nil-Coalescing Precedence | ?? |
Comparison Precedence | != > < >= <= === == |
Logical Conjunction Precedence | && |
Logical Disjunction Precedence | || |
Default Precedence | ~> |
Ternary Precedence | ?: |
Function Arrow precedence | ( ) |
Assignment Precedence | |= %= /= &<<= &>>= &= *= >>= <<= ^= += -= |
示例1:Swift运算符优先级
let x = 4 + 5 * 5
print(x)
当您运行上述程序时,输出将是:
29
在上面的示例中,如果从左到右读取表达式,则可能期望输出为45。但是,乘法运算符的优先级高于加法运算符,因此表达式4 + 5 * 5
的求值为4 + (5 * 5)
。因此, print(x)
在屏幕上输出29。
Steps | Operator | Expression | Value returned from expression |
---|---|---|---|
1 | * | 5 * 5 | 25 |
2 | + | 4 + 25 | 29 |
3 | = | print(x) | 29 |
示例2:具有复杂赋值运算符的 Swift运算符优先级
var y = 15
y += 10 - 2 * 3
print(y)
当您运行上述程序时,输出将是:
19
在上面的示例中,表达式var y = 15
15在变量y中分配值15。
在下一个表达式y += 10 - 2 * 3
,乘法运算符的优先级高于减法和复合赋值运算符( +=
)。
因此,将表达式y += 10 - 2 * 3
评估为y = y + (10 - (2 * 3))
。
Steps | Operator | Expression | Value returned from expression |
1 | = | var y = 15 | 15 |
2 | * | 2 * 3 | 6 |
3 | – | 10 – 6 | 4 |
4 | += | 15 + 4 | 19 |
迅速算子关联
尽管存在由运算符优先级定义的预定义规则来评估表达式,但是您可能想知道如果存在多个相同优先级的运算符会发生什么。 运算符关联性定义了如何将具有相同优先级的运算符组合在一起。
在Swift中, 运算符可以是左侧关联,右侧关联或没有关联性。在表达式中按顺序使用时,左关联的运算符从语句的左侧开始对它们的操作数进行分组,从右边开始将其右关联运算符分组,并且没有关联性的运算符没有定义的行为。
操作员关联表
下表显示了Swift 运算符的关联性及其优先级。
Operator Groups | Examples | Associativity |
---|---|---|
Bitwise shift precedence | >> &<< &>> >> | none |
Multiplication precedence | &* % & * / | left |
Addition precedence | | &+ &- + – ^ | left |
Range Formation Precedence | ..< … | none |
Casting Precedence | is as | none |
Nil-Coalescing Precedence | ?? | right |
Comparison Precedence | != > < >= <= === == | none |
Logical Conjunction Precedence | && | left |
Logical Disjunction Precedence | || | left |
Default Precedence | ~> | none |
Ternary Precedence | ?: | right |
Function Arrow precedence | ( ) | right |
Assignment Precedence | |= %= /= &<<= &>>= &= *= >>= <<= ^= | right |
示例3:Swift运算符关联
let x = 40 / 2 * 10
print(x)
当您运行上述程序时,输出将是:
200
在上面的程序中,表达式是从左到右计算的,因为运算符属于乘法优先级组,并且具有左关联性。因此,除法运算会更早进行,您会得到结果200 。如果要先执行乘法怎么办?您需要将2 * 10
表达式包装为()大括号,如下所示:
let x = 40 / (2 * 10)
print(x)
当您运行上述程序时,输出将是:
2
您无需记住优先级和关联表。在大多数情况下, 运算符的优先级和关联性本身就是很有意义的。如有疑问,您可以随时使用该表作为参考。另外,最好使用括号使代码更易于理解。