文档章节

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

柳哥
 柳哥
发布于 2014/06/06 13:25
字数 830
阅读 90
收藏 0

操作符的优先级决定了表达式的哪个部分先于其他部分被计算。由于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) 后置操作符

© 著作权归作者所有

共有 人打赏支持
柳哥
粉丝 206
博文 405
码字总数 347782
作品 0
杭州
技术主管
私信 提问
swift4.1 系统学习二十四 操作符方法与操作符的定制

/* 操作符方法与操作符的定制 到目前为止,我们已经学习了swift的绝大部分的语法特性。本节中,我们还要学习swift的另一个灵活 多样的语法特性 —— 操作符方法。我们可以为自己定义的类或者...

小曼Study
2018/11/02
0
0
【计算机本科补全计划】Java学习笔记(五) 运算符

正文之前 本文属于流水账,因为早就在C++里面学过了。Java基本是继承了C++的那些,所以贴个代码应该就OK了👌,当然,有点特有的运算符我还是得解释下的。毕竟以后翻笔记的话缺了就不美了 ...

HustWolf
2017/11/26
0
0
Java 运算符

Java 运算符 计算机的最基本用途之一就是执行数学运算,作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量。我们可以把运算符分成以下几组: 算术运算符 关系运算符 位运算符 逻辑...

北國丶江山
2016/09/05
8
0
c++:由int *(*p(int))[10];导致对操作符优先级和结合方向的复习

C++操作符的优先级 操作符及其结合性 功能 用法 L L L :: :: :: 全局作用域 类作用域 名字空间作用域 ::name class::name namespace::name L L L L L . -> [] () () 成员选择 成员选择 下标 ...

Matrix4X4
2012/04/13
140
0
数据结构-栈应用(中缀转后缀并计算结果)

关于中缀和后缀表达式基础概念自行百度。 对于中缀转后缀表达式并计算结果思路可归纳为以下: 1、将每个数据当做一个结构体,包含对应的类型以及数值; 2、对于给定的中缀表达式,转为结构体数...

sssssuuuuu666
2017/12/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

vue 对对象的属性进行修改时,不能渲染页面 vue.$set()

我在vue里的方法里给一个对象添加某个属性时,我console.log出来的是已经更改的object ,但是页面始终没有变化 原因如下: **受现代 JavaScript 的限制 (而且 Object.observe 也已经被废弃),...

Js_Mei
今天
2
0
开始看《Java学习笔记》

虽然书买了很久,但一直没看。这其中也写过一些Java程序,但都是基于IDE的帮助和对C#的理解来写的,感觉不踏实。 林信良的书写得蛮好的,能够帮助打好基础,看得出作者是比较用心的。 第1章概...

max佩恩
昨天
12
0
Redux 三大原则

1.单一数据源 在传统的MVC架构中,我们可以根据需要创建无数个Model,而Model之间可以互相监听、触发事件甚至循环或嵌套触发事件,这些在Redux中都是不被允许的。 因为在Redux的思想里,一个...

wenxingjun
昨天
8
0
跟我学Spring Cloud(Finchley版)-12-微服务容错三板斧

至此,我们已实现服务发现、负载均衡,同时,使用Feign也实现了良好的远程调用——我们的代码是可读、可维护的。理论上,我们现在已经能构建一个不错的分布式应用了,但微服务之间是通过网络...

周立_ITMuch
昨天
5
0
XML

学习目标  能够说出XML的作用  能够编写XML文档声明  能够编写符合语法的XML  能够通过DTD约束编写XML文档  能够通过Schema约束编写XML文档  能够通过Dom4j解析XML文档 第1章 xm...

stars永恒
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部