Java运算符优先级 #
一、优先级概述 #
当一个表达式中包含多个运算符时,Java会按照优先级顺序进行计算。优先级高的运算符先执行。
1.1 基本原则 #
- 优先级高的先计算
- 相同优先级按结合性计算
- 括号优先级最高
1.2 简单示例 #
java
int result = 2 + 3 * 4; // 14,不是20
// 先计算 3 * 4 = 12
// 再计算 2 + 12 = 14
int result2 = (2 + 3) * 4; // 20
// 括号优先级最高,先计算 2 + 3 = 5
// 再计算 5 * 4 = 20
二、运算符优先级表 #
从高到低排列:
| 优先级 | 运算符 | 说明 | 结合性 |
|---|---|---|---|
| 1 | ()、[]、.、-> | 括号、数组访问、成员访问 | 从左到右 |
| 2 | ++、–、+、-、!、~ | 一元运算符 | 从右到左 |
| 3 | *、/、% | 乘除、取余 | 从左到右 |
| 4 | +、- | 加减 | 从左到右 |
| 5 | <<、>>、>>> | 移位 | 从左到右 |
| 6 | <、<=、>、>=、instanceof | 比较 | 从左到右 |
| 7 | ==、!= | 相等比较 | 从左到右 |
| 8 | & | 按位与 | 从左到右 |
| 9 | ^ | 按位异或 | 从左到右 |
| 10 | | | 按位或 | 从左到右 |
| 11 | && | 逻辑与 | 从左到右 |
| 12 | || | 逻辑或 | 从左到右 |
| 13 | ?: | 三元运算符 | 从右到左 |
| 14 | =、+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=、>>>= | 赋值 | 从右到左 |
三、结合性 #
3.1 从左到右 #
java
int a = 10 - 5 - 2; // (10 - 5) - 2 = 3
int b = 100 / 10 / 2; // (100 / 10) / 2 = 5
String s = "Hello" + " " + "World"; // 从左到右连接
3.2 从右到左 #
java
int a, b, c;
a = b = c = 10; // 从右到左赋值
// 等价于
c = 10;
b = c;
a = b;
// 三元运算符从右到左
int x = true ? 1 : false ? 2 : 3;
// 等价于
int x = true ? 1 : (false ? 2 : 3); // 1
四、常见场景 #
4.1 算术运算 #
java
int a = 2 + 3 * 4 - 6 / 2;
// 计算顺序:
// 1. 3 * 4 = 12
// 2. 6 / 2 = 3
// 3. 2 + 12 = 14
// 4. 14 - 3 = 11
System.out.println(a); // 11
4.2 比较与逻辑 #
java
int a = 5, b = 10, c = 15;
boolean result = a < b && b < c;
// 1. a < b → true
// 2. b < c → true
// 3. true && true → true
boolean result2 = a < b || b > c && c > a;
// 1. b > c → false
// 2. false && true → false
// 3. true || false → true
4.3 位运算与比较 #
java
int a = 5, b = 3;
boolean result = a > b && (a & b) == 1;
// 1. a > b → true
// 2. a & b = 5 & 3 = 1
// 3. 1 == 1 → true
// 4. true && true → true
4.4 赋值与运算 #
java
int a = 10;
int b = a += 5;
// 1. a += 5 → a = 15
// 2. 赋值表达式值为15
// 3. b = 15
System.out.println(a); // 15
System.out.println(b); // 15
五、使用括号明确优先级 #
5.1 为什么要用括号 #
java
// 难以理解
boolean r1 = a > b && c < d || e == f && g != h;
// 清晰明了
boolean r2 = (a > b && c < d) || (e == f && g != h);
5.2 括号使用示例 #
java
// 复杂条件
if ((user.isActive() && user.hasPermission("read")) || user.isAdmin()) {
// ...
}
// 位运算
int result = (a | b) & (c | d);
// 三元运算符
String s = (a > b) ? "大于" : (a == b) ? "等于" : "小于";
六、常见陷阱 #
6.1 位运算与比较优先级 #
java
int a = 5, b = 3;
// 错误理解
// boolean r = a & b == 1; // 编译错误
// 正确写法
boolean r = (a & b) == 1; // true
6.2 赋值与比较混淆 #
java
int a = 10;
// 错误:= 是赋值
// if (a = 10) { } // 编译错误
// 正确:== 是比较
if (a == 10) { } // 正确
6.3 自增与运算 #
java
int a = 5;
int b = a++ + ++a;
// 1. a++: 值为5, a变为6
// 2. ++a: a变为7, 值为7
// 3. 5 + 7 = 12
System.out.println(a); // 7
System.out.println(b); // 12
// 建议:拆分为多行
int c = 5;
int temp1 = c++;
int temp2 = ++c;
int d = temp1 + temp2; // 12
6.4 三元运算符嵌套 #
java
int a = 5;
String result = a > 10 ? "大于10" : a > 5 ? "大于5" : "小于等于5";
// 从右到左结合
// 等价于
String result2 = a > 10 ? "大于10" : (a > 5 ? "大于5" : "小于等于5");
// 结果:"小于等于5"
七、记忆技巧 #
7.1 分组记忆 #
text
最高优先级:
() [] .
一元运算符:
++ -- ! ~ + -
算术运算符:
* / % (高)
+ - (低)
移位运算符:
<< >> >>>
比较运算符:
< <= > >= instanceof (高)
== != (低)
位运算符:
& (高)
^ (中)
| (低)
逻辑运算符:
&& (高)
|| (低)
三元运算符:
?:
赋值运算符:
= += -= ...
7.2 口诀 #
text
单目乘除为加减,移位比较等不等
按位与或异或连,逻辑与或最后看
三元赋值放最后,括号永远最优先
八、最佳实践 #
8.1 使用括号 #
java
// 不推荐
if (a > b && c < d || e == f) { }
// 推荐
if ((a > b && c < d) || e == f) { }
8.2 拆分复杂表达式 #
java
// 不推荐
boolean result = user != null && user.isActive() && user.getAge() > 18 && user.hasPermission("read");
// 推荐
boolean isUserValid = user != null && user.isActive();
boolean isAdult = user.getAge() > 18;
boolean canRead = user.hasPermission("read");
boolean result = isUserValid && isAdult && canRead;
8.3 避免复杂嵌套 #
java
// 不推荐
int result = a > b ? c > d ? e : f : g;
// 推荐
int result;
if (a > b) {
result = c > d ? e : f;
} else {
result = g;
}
九、总结 #
| 优先级组 | 运算符 | 记忆要点 |
|---|---|---|
| 最高 | () [] . | 括号永远优先 |
| 一元 | ++ – ! ~ | 单目运算符 |
| 算术 | * / % → + - | 先乘除后加减 |
| 移位 | << >> >>> | 移位运算 |
| 比较 | < > → == != | 先大小后相等 |
| 位运算 | & → ^ → | | 与异或 |
| 逻辑 | && → || | 与或 |
| 三元 | ?: | 条件运算 |
| 赋值 | = += … | 最后赋值 |
运算符优先级要点:
- 不确定时使用括号
- 拆分复杂表达式
- 注意结合性方向
- 优先级表仅供参考,代码可读性更重要
最后更新:2026-03-26