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