项目实战:说一说运算符优先级和代码可读性
来源:互联网 发布: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
一失足成千古恨~
加括号,让代码具有良好的可读性才是王道。
- 项目实战:说一说运算符优先级和代码可读性
- Java运算符和优先级
- Java运算符和优先级
- 运算符优先级和关联性
- 指针和运算符优先级
- Pascal运算符和优先级
- python运算符和优先级
- c++ “&”运算符和“+”运算符优先级
- 影响项目代码可读性的反面教材
- 代码可读性
- 注意代码的规范和可读性
- 代码模块化和可读性的tradeoff
- 运算符的优先级和结合律
- 类型转换和运算符优先级问题
- C++ 运算符优先级和结合性
- 运算符的优先级和结合性
- 运算符的优先级和结合性
- 运算符优先级和结合性
- 工厂方法模式
- Python之列表,字符串,元组,字典,斐波那契数列
- 深度学习库Deep Learning Libraries by Language
- Android图表库MPAndroidChart(六)——换一种思考方式,水平条形图的实现过程
- C++Primer第五版 第一章习题答案(部分)
- 项目实战:说一说运算符优先级和代码可读性
- C++与设计模式(11)——装饰模式
- 深入理解TCP三次握手和四次挥手过程
- spring框架整合ibatis的项目实例代码
- 安卓页面适配
- 深度学习框架
- SIFT特征提取与描述算法
- Android笔记:拼合两张Bitmap图片(两张直接贴合)
- TextField内文字距左边框的内边距