Java基础:运算符优先级,哪个最高?哪个最低?
【摘要】 在上一篇文章中,我们结束了Java中所有运算符的知识点,我们先来通过一张图来回忆一下Java的运算符一共包含哪些:那么多运算符,如果组合使用的时候,它们的优先级是什么样的?本文就带大家走进运算符的优先级。 概述Java的运算符执行顺序很重要,因为顺序的不同,会直接导致结果的不同。我们先通过一张表格来说明一下优先级:优先级运算符最高++x --x +x ~ !↓new(类型)x↓* / %↓+...
在上一篇文章中,我们结束了Java中所有运算符的知识点,我们先来通过一张图来回忆一下Java的运算符一共包含哪些:
那么多运算符,如果组合使用的时候,它们的优先级是什么样的?
本文就带大家走进运算符的优先级。
概述
Java的运算符执行顺序很重要,因为顺序的不同,会直接导致结果的不同。
我们先通过一张表格来说明一下优先级:
优先级 | 运算符 |
---|---|
最高 | ++x --x +x ~ ! |
↓ | new(类型)x |
↓ | * / % |
↓ | + - |
↓ | << >> >>> |
↓ | < > <= >= instanceof |
↓ | == != |
↓ | & |
↓ | ^ |
↓ | | |
↓ | && |
↓ | || |
?: | |
最低 | = += -= *= /= %= &= ^= |= <<= >>= >>>= |
由表格所知:
- 后缀运算符(例如 a++、a–)在 java 中具有最高的优先级。
- 赋值运算符及其不同形式在java中具有最低的优先级。
此外在计算的时候还需要记住以下规则:
- 运算符的操作数从左到右计算,例如在 expression++a + b–中,首先计算操作数++a然后 b–计算。
- 运算符的每个操作数(条件运算符 、 和 除外&&)||在? :执行运算本身的任何部分之前都经过完整评估。例如在 expression++a + b–中,加法运算只会在 ++aandb–被求值之后发生。
- 二元运算符的左侧操作数在右侧操作数的任何部分被求值之前被完全求值。
- 括号给出的评估顺序()优先于运算符优先级。
- ++or的前缀版本–评估/使用表达式中递增的值,而++or的后缀版本–评估当前值,然后增加/减少操作数值。
- 除赋值运算符外,所有二元运算符都是从左到右求值的。
如何改变运算符的优先级?
括号“()”用于更改运算符的优先级,例如在一个表达式a+b*c中,如果你想让加法运算先计算,那么将表达式重写为(a+b)*c.
代码演示
我们根据以上介绍的运算符优先级,用代码的形式简单介绍比较典型的例子:
package com.test.javaroads.operator;
/**
* @author: javaroads
* @date: 2022/12/8 22:36
* @description:
*/
public class Fifteen {
public static void main(String[] args) {
int x = 6, y = 7, z = 8;
int r1 = x + y * z / 10;
System.out.println(r1);
int r2 = x + --y - ++z;
System.out.println(r2);
int r3 = ++x + ++y + 5 << 1 | 2;
System.out.println(r3);
boolean x1 = false, y1 = true, z1 = false;
boolean r4 = x1 == y1 == z1;
System.out.println(r4);
int r5 = x - ++y - ++z;
System.out.println(r5);
}
}
执行结果:
11
3
38
true
-11
下面我们来逐一分析一下:
案例一
int x = 6, y = 7, z = 8;
int r1 = x + y * z / 10;
- 和 /的优先级大于+运算符的优先级,所以
y * z / 10
将被先执行,* 和 /具有相同的优先级,因此它们将以从左到右的顺序关联,所以就等价于x + (y * z) / 10
。
案例二
int x = 6, y = 7, z = 8;
int r2 = x + --y - ++z;
++ 和 --的优先级大于- 和 +运算符的优先级,所以r2 = x + --y - ++z
等价于r2 = x + (--y) - (++z)
。
案例三
int x = 6, y = 7, z = 8;
int r3 = ++x + ++y + 5 << 1 | 2;
++ 和 --的优先级大于+ 和 <<运算符的优先级,所以++x
和++y
将被先执行,此外,<<的优先级大于+运算符的优先级,综上,++x + ++y + 5 << 1 | 2
就等价于(((++x) + (++y) + 5) << 1)| 2
。
案例四
boolean x1 = false, y1 = true, z1 = false;
boolean r4 = x1 == y1 == z1;
赋值运算符=的优先级最低,等于运算符(==)从左到右进行计算,所以r4 = x1 == y1 == z1
等价于r4 = ((x1 == y1) == z1)
。
案例五
int x = 6, y = 7, z = 8;
int r5 = x - ++y - ++z;
这个同理,++
优先级比-
要高,所以x - ++y - ++z
等价于x - (++y) - (++z)
。
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)