文档章节

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

柳哥
 柳哥
发布于 2014/06/06 13:25
字数 830
阅读 89
收藏 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) 后置操作符

© 著作权归作者所有

共有 人打赏支持
柳哥
粉丝 203
博文 405
码字总数 347782
作品 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
javascript运算符语法概述

操作数个数   javascript的运算符总共有46个,如果根据其操作数的个数进行分类,则大多数是二元运算符(binary operator),它们的操作数都是两个,它们将两个表达式合并成复杂表达式 1 + 2;...

jjjssswww
2017/06/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

GO 数组相关操作

package mainimport("fmt""math/rand""time")func main() {//数组的几种定义方式var arr1 [3]int = [3]int{1,2,3}var arr2 = [3]int{4,5,6}arr3 := [3]string{"h", "w", ......

汤汤圆圆
23分钟前
0
0
JAVA 中interrupt、interrupted和isInterrupted的区别

首先,我们说明下三个方法的功能 interrupt() 向当前调用者线程发出中断信号 isinterrupted() 查看当前中断信号是true还是false interrupted() 是静态方法,查看返回当前中断信号并将中断信号...

我爱春天的毛毛雨
28分钟前
0
0
Coding and Paper Letter(二十二)

资源整理。 1 Coding: 1.开源项目openeo api。oponEO开发了一个开放的API,以简单统一的方式将R,python和javascript客户端连接到对地观测大数据云平台的后台。 此存储库包含此API,即oponE...

胖胖雕
53分钟前
1
0
RxJS的另外四种实现方式(三)——性能最高的库

接上篇 RxJS的另外四种实现方式(二)——代码最小的库(续) 代码最小的库rx4rx-lite虽然在性能测试中超过了callbag,但和most库较量的时候却落败了,于是我下载了most库,要解开most库性能...

一个灰
今天
4
0
马太效应

马太效应

yizhichao
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部