项目实战:说一说运算符优先级和代码可读性

来源:互联网 发布:eclipse使用ubuntu字体 编辑:程序博客网 时间:2024/06/10 05:46

拿我们项目中的一行代码说事,说一说运算符优先级和代码可读性问题。

请大家看一下这一行代码表达的意思和可能出现的问题,请忽略它的业务意义哈。

dto.getStatus() ==1? false :true|| imageDto == null

写这行代码的人的初衷是:

dto.getStatus() ==1? false :true)||(imageDto == null) 

然而现实往往不如人意,因为这要说运算符优先级说起,

请参考Java运算符优先级

 

序列号

符号

名称

结合性(与操作数)

目数

说明

1

.

从左到右

双目

 

( )

圆括号

从左到右

 

 

[ ]

方括号

从左到右

 

 

2

+

正号

从右到左

单目

 

-

负号

从右到左

单目

 

++

自增

从右到左

单目

前缀增,后缀增

- -

自减

从右到左

前缀减,后缀减

~

按位非/取补运算

从右到左

单目

 

逻辑非

从右到左

单目

“!”不可以与“=”联用

3

*

从左到右

双目

 

/

从左到右

双目

整数除法:取商的整数部分,小数部分去掉,不四舍五入

%

取余

从左到右

双目

 

4

+

从左到右

双目

 

-

从左到右

双目

 

5

<< 

左移位运算符

从左到右

双目

 

>> 

带符号右移位运算符

从左到右

双目

 

>>> 

无符号右移

从左到右

双目

 

6

小于

从左到右

双目

关系运算符“大于”说明

<=

小于或等于

从左到右

双目

 

大于

从左到右

双目

 

>=

大于或等于

从左到右

双目

 

instanceof

确定某对象是否属于指定的类

从左到右

双目

 

7

==

等于

从左到右

双目

关系运算符“==”说明

!=

不等于

从左到右

双目

 

8

&

按位与

从左到右

双目

 

9

|

按位或

从左到右

双目

 

10

^

按位异或

从左到右

双目

 

11

&&

短路与

从左到右

双目

 

12

||

短路或

从左到右

双目

 

13

? :

条件运算符

从右到左

三目

 

14

=

赋值运算符

从右到左

双目

 

+=

混合赋值运算符

 

-=

 

*=

 

/=

 

%=

 

&=

 

|=

 

^=

 

<<=

 

>>=

 

>>>=

 



由图可知,优先级排序:“==” > “||” > “?:”


正所谓实践出真知,我们写Demo测试一下:

Object imageDto = null;System.out.println(1==1? false :true|| imageDto == null);System.out.println(0==1? false :true|| imageDto == null);imageDto = "xxx";System.out.println(1==1? false :true|| imageDto == null);System.out.println(0==1? false :true|| imageDto == null);

输出结果:false true false true

按照我们推断的结果,应该是这样:

Object imageDto = null;System.out.println(1==1? false :(true|| (imageDto == null)));System.out.println(0==1? false :(true|| (imageDto == null)));imageDto = "xxx";System.out.println(1==1? false :(true|| (imageDto == null)));System.out.println(0==1? false :(true|| (imageDto == null)));

输出结果:false true false true

验证了我们的推理。


那如果按作者的初衷应该是怎样的呢?

Object imageDto = null;System.out.println((1==1? false :true) || (imageDto == null));System.out.println((0==1? false :true) || (imageDto == null));imageDto = "xxx";System.out.println((1==1? false :true) || (imageDto == null));System.out.println((0==1? false :true) || (imageDto == null));

输出结果:true true false true

一失足成千古恨~


加括号,让代码具有良好的可读性才是王道。




0 0