Scala 操作符优先级和关联性

操作符优先级

Scala根据操作符中的第一个字符决定优先级

(一些其他特殊字符)
* / %
+ -
:
= !
< >
& 
ˆ
|
(字母)
(赋值操作符)

表中按优先级递减的顺序显示操作符的第一个字符的优先级,同一行的字符具有相同的优先级。这个表中的字符越高,以该字符开头的方法的优先级就越高。下面的例子说明了优先级的影响:

scala> 2 << 2 + 2
res0: Int = 32

<<方法以字符<开始,它在表中出现的位置比字符+低,而字符+是+操作符的第一个也是惟一一个字符。因此,<<的优先级将低于+,表达式将通过首先调用+方法求值,然后调用<<方法,像2 <<(2 + 2)这样。根据我们的计算,2 + 2 = 4,2 << 4 = 32。

前面提到的优先规则的一个例外与赋值操作符有关。如果运算符以等号字符(=)结尾,并且该运算符不是比较运算符<=、>=、==或!=中的一个,那么该运算符的优先级与简单赋值(=)相同。也就是说,它比任何其他运算符的优先级都低。例如:

x *= y + 1
和这个一样:
x *= (y + 1)
因为*=被分类为优先级低于+的赋值操作符,尽管操作符的第一个字符是*,优先级高于+

操作符关联性

当相同优先级的多个运算符并排出现在表达式中时,运算符的关联性决定了运算符的分组方式。Scala中操作符的关联性由其最后一个字符决定。我们已经知道, 任何以’:'字符结尾的方法都会在其右操作数上调用,并传递左操作数。以任何其他字符结尾的方法正好相反:它们在左操作数上调用,并传入右操作数。所以a * b产生a.* (b),但a:::b产生b.::: (a)。
然而,无论一个操作符具有什么样的关联性,它的操作数总是从左到右求值。因此,如果a是一个表达式,它不仅仅是一个对不可变值的简单引用,那么a::: b被更精确地处理为如下块:

{ val x = a; b.:::(x) }

在这个块中,a仍然在b之前求值,然后这个求值的结果作为操作数传递给b的:::方法。
当具有相同优先级的多个操作符并排出现时,这个结合律也会发挥作用。如果方法以’:'结尾,则从右到左分组;否则,它们从左到右分组。例如,
a::: b::: c被视为a::: (b::: c),但是a * b * c却被视为(a * b) * c。
运算符优先级是Scala语言的一部分。你不必害怕使用它。尽管如此,使用括号来阐明什么操作符操作什么表达式是一种很好的风格。也许其他程序员不需要查询就知道乘法运算符*、/和%的优先级比加法运算符+和-的优先级高,这是惟一可以真正指望的优先级。因此即使a + b << c没有括号,也能产生你想要的结果,额外清晰地写作(a + b) << c可能会减少你的同行在运算符号上发出你的名字的频率,例如,厌恶地大喊,“账单! * &ˆ% ~代码!”。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值