基本类型和操作之操作符的优先级和关联性

操作符的优先级决定了表达式的哪个部分先于其他部分被计算。由于scala没有操作符,实际上,操作符只是方法的一种表达方式,你或许想知道操作符优先级是怎么做到的。对于以操作符形式使用的方法,scala根据操作符的第一个字符判断方法的优先级(这个规则有个例外,后面再说)。比方说,如果方法名开始于*,那么就比开始于+的方法有更高的优先级。因此,2+2*7将被评估为2+(2*7)。

操作符优先级表

[所有其他的特殊字符]
*   /    %
+   -
:
=   !
<   >
&
^
|
[所有字母]
[所有赋值操作符]

上表以降序方式列举了以方法第一个字符判定的优先级,同一行的字符具有同样的优先级。表中字符的位置越高,以这个字符开始的方法具有的优先级就越高。如例:

基本类型和操作之操作符的优先级和关联性

<< 方法开始于字符 < ,在表中的位置比 + 要。 因此 << 比 + 的优先级低,表达式也要在先调用了 + 方法之后再调用  << 方法,如:2 << (2 + 2)。下面给出另一个例子:

基本类型和操作之操作符的优先级和关联性

除以上提到的优先级规则外,还有以等号结束的赋值操作符如果操作符以等号字符(=)结束,且操作符并非比较操作符:<=,>=,==,或=,那么这个操作符的优先级与赋值符(=)相同。也就是说,它比任何其他操作符的优先级都低。如:

基本类型和操作之操作符的优先级和关联性

与下面的相同:

基本类型和操作之操作符的优先级和关联性

因为 *= 被当作赋值操作符,它的优先级低于 +尽管操作符的第一个字符是 *。(注:这里应该就是上面表中规则的例外!!


同样优先级的多个操作符并列出现在表达式里时,操作符的关联性决定了操作符分组的方式Scala里操作符的关联性取决于它的最后一个字符任何以字符结尾的方法由它的操作数调用,并传入左操作数。以其它字符结尾的方法与之相反,它们都是被左操作数调用,并传入右操作数的。因此:a * b 变成 a.*(b),但是 a:::b变成 b.:::(a)。

基本类型和操作之操作符的优先级和关联性

然而,不论操作符具有什么样的关联性,它的操作数总是从左到右计算的。例如,更精确的意义上说,a:::b将会被当作是:

基本类型和操作之操作符的优先级和关联性

a:::b这个代码块中,a仍然在b之前被计算,然后计算结果被当作操作数传给b的:::方法
这种关联性规则在同时使用多个具有同优先级的操作符时也会起作用。如果方法结束于:,它们就被自右向左分组;反过来,就是自左向右分组。无论如何,使用括号去理清什么操作符作用在哪个表达式上都是好的风格


另外,还有一个要注意的地方。后置操作符的优先级低于中置操作符
a  中置操作符 b  后置操作符
上述代码等同于:
(a  中置操作符  b) 后置操作符

基本类型和操作之操作符的优先级和关联性

转载于:https://my.oschina.net/fhd/blog/274994