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

本文详细介绍了Scala语言中操作符的优先级规则及其如何决定表达式的计算顺序。包括操作符优先级表、关联性规则及特殊情况说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

操作符优先级表

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

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

132738_3dgA_168814.jpg

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

132959_7xaU_168814.jpg

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

133301_odJR_168814.jpg

与下面的相同:

133441_DpJ9_168814.jpg

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


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

133802_BVHR_168814.jpg

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

134034_fZbl_168814.jpg

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


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

134445_RtWK_168814.jpg

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值