📜  Swift运算符的优先级和关联性

📅  最后修改于: 2020-10-09 15:57:27             🧑  作者: Mango

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

Swift运算符优先级

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


运算符优先级表

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

Swift Standard Library Precedence Groups (Highest to Lowest)
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。

Execution Steps
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))

Execution Steps
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 运算符的关联性及其优先级。

Swift Standard Library Associativity (Precedence Highest to Lowest)
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

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