自学内容网 自学内容网

运算符 优先级 详解

在 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)!