文档章节

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

柳哥
 柳哥
发布于 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) 后置操作符

© 著作权归作者所有

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

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

小曼Study
11/02
0
0
Java 运算符

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

北國丶江山
2016/09/05
8
0
【计算机本科补全计划】Java学习笔记(五) 运算符

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

HustWolf
2017/11/26
0
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

没有更多内容

加载失败,请刷新页面

加载更多

JeeSite 4.x 树形结构的表设计和用法

有些同仁对于 JeeSite 4 中的树表设计不太了解,本应简单的方法就可实现,却写了很多复杂的语句和代码,所以有了这篇文章。 在 JeeSite 4 中的树表设计我还是相对满意的,这种设计比较容易理...

ThinkGem
14分钟前
10
0
0022-如何永久删除Kafka的Topic

1.问题描述 使用kafka-topics --delete命令删除topic时并没有真正的删除,而是把topic标记为:“marked for deletion”,导致重新创建相同名称的Topic时报错“already exists”。 2.问题复现...

Hadoop实操
17分钟前
0
0
技术工坊|区块链中的p2p网络(上海)

区块链是一个去中心化的系统,每个节点分布在全球各地,那么节点之间是如何自发地组成网络,又如何进行通信的?区块链中的p2p网络算法与bt下载中的p2p网络有什么区别?11月28日,第29期技术工...

HiBlock
22分钟前
1
0
MySQL性能优化之char、varchar、text的区别

在存储字符串时, 可以使用char、varchar或者text类型, 那么具体使用场景呢? 参考下面这个表结构: 1、 char长度固定, 即每条数据占用等长字节空间;适合用在身份证号码、手机号码等定。 ...

hansonwong
25分钟前
0
0
并发编程系列:4大并发工具类的功能、原理、以及应用场景

一:并发工具包 1.并发工具类 提供了比synchronized更加高级的各种同步结构:包括CountDownLatch、CyclicBarrier、Semaphore等,可以实现更加丰富的多线程操作。 2.并发容器 提供各种线程安全...

游人未归
35分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部