Java运算符优先级
2年前 (2024-04-27)
所有的数学运算都认为是从左向右运算的,Java 语言中大部分运算符也是从左向右结的,只有单目运算符、赋值运算符和三目运算符例外,其中,单目运算符、赋值运算符和三目运算符是从右向左结的,也就是从右向左运算。
乘法和加法是两个可结的运算,也就是说,这两个运算符左右两边的操作数可以互换位置而不会影响结果。运算符有不同的优先级,所谓优先级就是在表达式运算中的运算顺序。
一般而言,单目运算符优先级较高,赋值运算符优先级较低。算术运算符优先级较高,关系和逻辑运算符优先级较低。多数运算符具有左结性,单目运算符、三目运算符、赋值运算符具有右结性。
Java 语言中运算符的优先级共分为 14 级,其中 1 级最高,14 级。在同一个表达式中运算符优先级高的先执行。表 1 列出了所有的运算符的优先级以及结性。
使用优先级为 1 的小括号可以改变其他运算符的优先级,即如果需要将具有较低优先级的运算符先运算,则可以使用小括号将该运算符和操作符括起来。例如下面的表达式:
① 先计算 y 的自减运算符,即 --y。
② 再计算 x 的自增运算符,即 ++x。
③ 接着计算 z 的自增运算符,即 ++z。
④ 由于逻辑与比逻辑或的优先级高,这里将 ② 和 ③ 的结果进行逻辑与运算,即 ++x && ++z。
⑤ 将 ④ 的结果与 ① 进行逻辑或运算,即 --y||++x&&++z。
乘法和加法是两个可结的运算,也就是说,这两个运算符左右两边的操作数可以互换位置而不会影响结果。运算符有不同的优先级,所谓优先级就是在表达式运算中的运算顺序。
一般而言,单目运算符优先级较高,赋值运算符优先级较低。算术运算符优先级较高,关系和逻辑运算符优先级较低。多数运算符具有左结性,单目运算符、三目运算符、赋值运算符具有右结性。
Java 语言中运算符的优先级共分为 14 级,其中 1 级最高,14 级。在同一个表达式中运算符优先级高的先执行。表 1 列出了所有的运算符的优先级以及结性。
优先级 | 运算符 | 结性 |
|---|---|---|
1 | ()、[]、{} | 从左向右 |
2 | !、+、-、~、++、-- | 从右向左 |
3 | *、/、% | 从左向右 |
4 | +、- | 从左向右 |
5 | «、»、>>> | 从左向右 |
6 | <、<=、>、>=、instanceof | 从左向右 |
7 | ==、!= | 从左向右 |
8 | & | 从左向右 |
9 | ^ | 从左向右 |
10 | | | 从左向右 |
11 | && | 从左向右 |
12 | || | 从左向右 |
13 | ?: | 从右向左 |
14 | =、+=、-=、*=、/=、&=、|=、^=、~=、«=、»=、>>>= | 从右向左 |
使用优先级为 1 的小括号可以改变其他运算符的优先级,即如果需要将具有较低优先级的运算符先运算,则可以使用小括号将该运算符和操作符括起来。例如下面的表达式:
在这个表达式中先进行括号内的减法运算,再将结果与 z 相乘,将积除以 5 得出结果。整个表达式的顺序按照从左向右执行,比较容易理解。(x-y)*z/5
再来看一个复杂的表达式,如下所示。
这个表达式中包含了算术运算符和逻辑运算符。根据表 1 中列出的优先级,可以确定它的执行顺序如下:--y || ++x && ++z;
① 先计算 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 的值是多少?这样的语句实在太恐怖了,即使多年的老程序员看到这样的语句也会眩晕。这样的代码只能在考试现,作为一个程序员如果写这样的代码,恐怕他马上就得走人了,因为他完全不懂程序开发。源代码就是一份文档,源代码的可读性比代码运行效率更重要。 因此在这里要提醒大家:
不要把一个表达式写得过于复杂,如果一个表达式过于复杂,则把它分成几步来完成。
- 不要过多地依赖运算符的优先级来控制表达式的执行顺序,这样可读性太差,尽量使用
()来控制表达式的执行顺序。
- 随机文章
- 青岛-马尔代夫(青岛直飞马尔代夫,海岛度假轻松享。)
- 中国吞并马尔代夫(中国与马尔代夫结为全面战略合作伙伴)
- 亚 马尔代夫(后的:探索神秘的马尔代夫探秘亚马尔代夫之旅)
- 现在 能去 马尔代夫(现在可以前往马尔代夫旅行吗?(38字))
- 平流尾马尔代夫(平流末珊瑚岛与马尔代夫岛屿之旅)
- 机票 上海 马尔代夫(航程查询:上海到马尔代夫往返机票预订)
- 北京马尔代夫费用(北京往返马尔代夫普及型费用大揭秘!)
- 万豪马尔代夫套餐(万豪马尔代夫度假套餐,探索海底世界)
- 马尔代夫香槟游泳(马尔代夫度假胜地开设香槟游泳项目)
- 广州马尔代夫岛屿(广州人现在能够前往马尔代夫度假岛!)
- 孟津 马尔代夫(旅游胜地:孟津马尔代夫)
- 蓝色 马尔代夫(马尔代夫蓝色的旅行)
- 宗申 马尔代夫(宗申打造进军马尔代夫市场)
- 江西马尔代夫排名(江西旅游景区荣登马尔代夫排行榜前列)
- 泰安马尔代夫照片(泰安姐妹花在马尔代夫拍摄的美丽照片)
- 巴基斯坦马尔代夫(巴基斯坦宣布解除对马尔代夫签证限制)
- 泰和马尔代夫健身(泰和马尔代夫:打造完美健身度假之旅)
- 海边马尔代夫平潭(美妙的度假胜地:平潭海边的马尔代夫)
- 眉山马尔代夫踩水(眉山一日游,玩转马尔代夫踩水体验!)
- 印尼马尔代夫旅行(印尼至马尔代夫游:探索两地文化风情)
- 抚州马尔代夫文案(走进抚州马尔代夫,享受梦幻海岛之旅)
- 辉县马尔代夫救人(辉县大爷跨越千里,马尔代夫海上救人)
- 西沙秒杀马尔代夫(西沙岛游走天堂,比马尔代夫更美丽。)
- 大连马尔代夫攻略(大连人的近距离“海外游”路线攻略!)
- 邢台马尔代夫烧烤(邢台市民在马尔代夫品尝传统烧烤佳肴)
- 绵阳马尔代夫婚纱(绵阳新人在马尔代夫留下美好婚纱照!)
- 江苏盱眙马尔代夫(江苏盱眙旅游推出马尔代夫主题活动!)
- 马尔代夫上岛预告(重返蓝色天堂!马尔代夫豪华上岛预告)
- 如何介绍马尔代夫(探秘马尔代夫:一个天堂般的度假胜地)
- 浪漫马尔代夫图片(美丽浪漫的马尔代夫——一组壮丽图片)
