Java运算符优先级

樵夫2021-08-20 10:54

所有的数学运算都认为是从左向右运算的,Java语言中大部分运算符也是从左向右结合的,只有单目运算符、赋值运算符和三目运算符例外,其中,单目运算符、赋值运算符和三目运算符是从右向左结合的,也就是从右向左运算。 

Java运算符优先级

乘法和加法是两个可结合的运算,也就是说,这两个运算符左右两边的操作数可以互换位置而不会影响结果。运算符有不同的优先级,所谓优先级就是在表达式运算中的运算顺序。  

一般而言,单目运算符优先级较高,赋值运算符优先级较低。算术运算符优先级较高,关系和逻辑运算符优先级较低。多数运算符具有左结合性,单目运算符、三目运算符、赋值运算符具有右结合性。  

Java语言中运算符的优先级共分为14级,其中1级最高,14级最低。在同一个表达式中运算符优先级高的先执行。表1列出了所有的运算符的优先级以及结合性。  

表1运算符的优先级  

 
优先级 运算符 结合性
1 ()、[]、{} 从左向右
2 !、+、-、~、++、-- 从右向左
3 *、/、% 从左向右
4 +、- 从左向右
5 «、»、>>> 从左向右
6 <、<=、>、>=、instanceof 从左向右
7 ==、!= 从左向右
8 & 从左向右
9 ^ 从左向右
10 | 从左向右
11 && 从左向右
12 || 从左向右
13 ?: 从右向左
14 =、+=、-=、*=、/=、&=、|=、^=、~=、«=、»=、>>>= 从右向左

使用优先级为1的小括号可以改变其他运算符的优先级,即如果需要将具有较低优先级的运算符先运算,则可以使用小括号将该运算符和操作符括起来。例如下面的表达式:  

(x-y)*z/5

在这个表达式中先进行括号内的减法运算,再将结果与z相乘,最后将积除以5得出结果。整个表达式的顺序按照从左向右执行,比较容易理解。  

再来看一个复杂的表达式,如下所示。  

--y || ++x && ++z;

这个表达式中包含了算术运算符和逻辑运算符。根据表1中列出的优先级,可以确定它的执行顺序如下:  

①先计算y的自减运算符,即--y。  

②再计算x的自增运算符,即++x。  

③接着计算z的自增运算符,即++z。  

④由于逻辑与比逻辑或的优先级高,这里将②和③的结果进行逻辑与运算,即++x&&++z。  

⑤最后将④的结果与①进行逻辑或运算,即--y||++x&&++z。  

如果没有上述对该表达式执行顺序的说明,第一眼看到它时将很难识别优先级。对于这类问题,可以通过添加小括号使表达的顺序更加清晰,而不用去查优先级表。如下所示为改进后的表达式。  

(--y)||((++x)&&(++z));

技巧:记住这么多运算符的优先级是比较困难的,因此读者应该在实际应用中多多练习。  

因为Java运算符存在这种优先级的关系,因此在做SCJP的时候或者某些公司的面试题,有如下Java代码:  

int a = 5;
int b = 4;
int c = a++- --b*++a/b-- >>2%a--;

问c的值是多少?这样的语句实在太恐怖了,即使多年的老程序员看到这样的语句也会眩晕。这样的代码只能在考试中出现,作为一个程序员如果写这样的代码,恐怕他马上就得走人了,因为他完全不懂程序开发。  

源代码就是一份文档,源代码的可读性比代码运行效率更重要。因此在这里要提醒大家:  

不要把一个表达式写得过于复杂,如果一个表达式过于复杂,则把它分成几步来完成。  

不要过多地依赖运算符的优先级来控制表达式的执行顺序,这样可读性太差,尽量使用()来控制表达式的执行顺序。  

以上就是小编为大家整理发布的“Java运算符优先级”一文,更多相关内容尽在开课吧Java教程频道。

Java运算符优先级

免责声明:本站所提供的内容均来源于网友提供或网络搜集,由本站编辑整理,仅供个人研究、交流学习使用。如涉及版权问题,请联系本站管理员予以更改或删除。
有用
分享