运算符 优先级 详解
在 Java 中,运算符的优先级决定了表达式的计算顺序。当表达式中包含多个运算符时,优先级较高的运算符会先执行。理解运算符优先级有助于正确书写和理解代码。以下是详细的运算符优先级分类和规则。
1. 运算符优先级表
优先级 | 运算符 | 运算类型 | 结合性 |
---|---|---|---|
1 (最高) | () | 圆括号,方法调用 | 从左到右 |
[] | 数组访问 | 从左到右 | |
. | 成员访问 | 从左到右 | |
2 | ++ (后置) -- (后置) | 自增/自减 | 从左到右 |
3 | ++ (前置) -- (前置) + - ~ ! | 一元运算符 | 从右到左 |
4 | * / % | 乘法、除法、取模 | 从左到右 |
5 | + - | 加法、减法 | 从左到右 |
6 | << >> >>> | 位移运算 | 从左到右 |
7 | < <= > >= | 比较运算符 | 从左到右 |
instanceof | 类型检查 | 从左到右 | |
8 | == != | 相等/不等 | 从左到右 |
9 | & | 按位与 | 从左到右 |
10 | ^ | 按位异或 | 从左到右 |
11 | | | 按位或 | 从左到右 |
12 | && | 逻辑与 | 从左到右 |
13 | || | 逻辑或 | 从左到右 |
14 | ?: | 三元运算符 | 从右到左 |
15 | = += -= *= /= %= … | 赋值运算符 | 从右到左 |
16 (最低) | , | 逗号运算符 | 从左到右 |
2. 优先级详解及示例
2.1 圆括号 ()
- 优先级最高,可以强制改变默认的计算顺序。
- 常用于明确运算顺序,增强代码可读性。
示例:
int a = 10, b = 5, c = 2;
System.out.println(a + b * c); // 输出:20 (先乘法,再加法)
System.out.println((a + b) * c); // 输出:30 (先加法,再乘法)
2.2 自增和自减
- 后置
++
/--
:先使用当前值,再自增/自减。 - 前置
++
/--
:先自增/自减,再使用新值。
示例:
int a = 5;
System.out.println(a++); // 输出:5,a 变为 6
System.out.println(++a); // 输出:7,a 已变为 7
2.3 一元运算符
- 包括前置
++
/--
、正负号(+
/-
)、按位取反(~
)、逻辑取反(!
)。 - 从右到左结合。
示例:
int a = 5;
System.out.println(-a); // 输出:-5
System.out.println(!true); // 输出:false
System.out.println(~a); // 输出:-6(二进制取反)
2.4 算术运算符
- 乘法、除法、取模(
*
/
%
)的优先级高于加法、减法(+
-
)。 - 从左到右结合。
示例:
int a = 10, b = 3, c = 2;
System.out.println(a + b * c); // 输出:16
System.out.println(a % b + c); // 输出:3 (先取模,再加法)
2.5 位移运算符
- 优先级低于算术运算符,从左到右结合。
- 包括左移
<<
,有符号右移>>
,无符号右移>>>
。
示例:
int a = 8; // 二进制:1000
System.out.println(a >> 1); // 输出:4(二进制:0100)
System.out.println(a << 2); // 输出:32(二进制:100000)
2.6 比较运算符
- 优先级低于位移运算符。
- 包括
<
<=
>
>=
和instanceof
。
示例:
int a = 5, b = 10;
System.out.println(a < b); // 输出:true
System.out.println(a instanceof Integer); // 检查类型(示例中无意义)
2.7 相等运算符
- 优先级低于比较运算符。
- 包括
==
和!=
。
示例:
int a = 5, b = 5;
System.out.println(a == b); // 输出:true
System.out.println(a != b); // 输出:false
2.8 按位运算符
- 按位与(
&
)、按位异或(^
)、按位或(|
)。 - 优先级低于相等运算符。
示例:
int a = 5, b = 3; // a = 0101, b = 0011
System.out.println(a & b); // 输出:1(二进制:0001)
System.out.println(a | b); // 输出:7(二进制:0111)
System.out.println(a ^ b); // 输出:6(二进制:0110)
2.9 逻辑运算符
- 包括逻辑与(
&&
)和逻辑或(||
)。 - 短路求值:遇到结果已确定时停止计算。
示例:
int a = 5, b = 0;
System.out.println((b != 0) && (a / b > 1)); // 不会计算 a / b,避免异常
2.10 三元运算符
- 格式:
condition ? value1 : value2
- 优先级低于逻辑运算符,从右到左结合。
示例:
int a = 5, b = 10;
System.out.println(a > b ? "a 大" : "b 大"); // 输出:b 大
2.11 赋值运算符
- 包括
=
+=
-=
*=
/=
等复合运算符。 - 优先级最低(仅高于逗号运算符),从右到左结合。
示例:
int a = 5;
a += 10; // 等价于 a = a + 10
System.out.println(a); // 输出:15
2.12 逗号运算符
- 用于在一个表达式中顺序计算多个子表达式,结果为最后一个子表达式的值。
示例:
int a = (1, 2, 3); // 最后一个值 3 赋给 a
System.out.println(a); // 输出:3
3. 注意事项和建议
3.1 模糊优先级时使用括号
- 如果不确定优先级,可以用括号明确运算顺序,避免歧义。
示例:
int a = 5, b = 10, c = 2;
System.out.println(a + b * c); // 输出:25
System.out.println((a + b) * c); // 输出:30
3.2 运算符结合性
- 运算符结合性决定了同级运算符的执行顺序(从左到右或从右到左)。
- 从左到右:算术运算
符、比较运算符、按位运算符等。 - 从右到左:赋值运算符、一元运算符等。
3.3 特殊运算符的优先级
- 三元运算符的优先级低于几乎所有运算符。
- 逻辑短路(
&&
、||
)优先级高于三元运算符,但低于比较运算符。
4. 总结
理解运算符优先级有助于编写清晰、正确的代码,但不推荐完全依赖优先级规则。如果表达式复杂或难以理解,使用括号明确顺序是最佳实践。
原文地址:https://blog.csdn.net/T_Y_F_/article/details/143991248
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!