运算符的优先级使得一些运算符优先于其他运算符;它们会先被执行。
结合性定义了相同优先级的运算符是如何结合的,也就是说,是与左边结合为一组,还是与右边结合为一组。可以将其理解为“它们是与左边的表达式结合的”,或者“它们是与右边的表达式结合的”。
当考虑一个复合表达式的计算顺序时,运算符的优先级和结合性是非常重要的。举例来说,运算符优先级解释了为什么下面这个表达式的运算结果会是 17
。
2 + 3 % 4 * 5
// 结果是 17
如果你直接从左到右进行运算,你可能认为运算的过程是这样的:
- 2 + 3 = 5
- 5 % 4 = 1
- 1 * 5 = 5
但是正确答案是 17
而不是 5
。优先级高的运算符要先于优先级低的运算符进行计算。与 C 语言类似,在 Swift 中,乘法运算符(*
)与取余运算符(%
)的优先级高于加法运算符(+
)。因此,它们的计算顺序要先于加法运算。
而乘法运算与取余运算的优先级相同。这时为了得到正确的运算顺序,还需要考虑结合性。乘法运算与取余运算都是左结合的。可以将这考虑成,从它们的左边开始为这两部分表达式都隐式地加上括号:
2 + ((3 % 4) * 5)
(3 % 4)
等于 3
,所以表达式相当于:
2 + (3 * 5)
3 * 5
等于 15
,所以表达式相当于:
2 + 15
因此计算结果为 17
。
有关 Swift 标准库提供的操作符信息,包括操作符优先级组和结合性设置的完整列表,请参见 操作符声明。
注意
相对 C 语言和 Objective-C 来说,Swift 的运算符优先级和结合性规则更加简洁和可预测。但是,这也意味着它们相较于 C 语言及其衍生语言并不是完全一致。在对现有的代码进行移植的时候,要注意确保运算符的行为仍然符合你的预期。