本文共 1769 字,大约阅读时间需要 5 分钟。
在编程过程中,了解Java运算符的优先级至关重要。尽管Java是一个严格的面向终点语言,其运算符的优先级和执行顺序可能会对结果产生深远影响。本文将通过表格和案例详细解释Java运算符的优先级规则,帮助你在编写代码时避免常见错误。
| 运算符类型 | 例子运算符 | 优先级 | 解释 |
|---|---|---|---|
| 高级运算符 | ++ -- + ~ ! | 最高 | 后缀递增递减运算符具有最高优先级,普通加法、减法及其运算符也不妨碍其优先顺序。 |
| 对象创建运算符 | new(类型)x | 次高 | 与并发使用的对象创建操作具有超高优先级。 |
| 算术运算符 | * / % - + | 算术运算符中,乘除具有更高优先级,且遵循从左到右的顺序。 | |
| 大于或小于运算符 | << >> >>> | 左边运算符优先于右边的逻辑运算符。 | |
| 比较运算符 | < > <= >=instanceof` | 比较运算符根据键盘切换符和等价关系解读,需注意优先级差异。 | |
| 等式运算符 | == != | 关系运算符语句优先级根据语言关键字,需特意注意其表达式的定义方式。 | |
| 按位运算符 | & ^ | || | 按位运算符执行顺序遵循&高于其他按位运算符的规则。 | |
| 赋值运算符 | = += -= *= /= %= &= ^= |= <<>= >>= >>>= ||= | 最低 | 赋值运算符优先级最低,总是执行最后一个操作。 |
了解运算符优先级远不止掌握其顺序。以下是几个关键规则:
从左到右执行:除括号外,运算符优先级高的先执行。例如,在表达式 x + y * z / 10 中,先执行 y * z,然后是 z / 10,最后执行 x + 结果。
完整评估前缀或插槽式运算符:在表达式 ++a + b-- 中,++a 和 b-- 都会被完全计算后才执行加法运算。
左结合运算符:此外,大多数二元运算符是左结合的(即按顺序执行)。例如,x == y == z 被解释为 (x == y) == z。
括号优先级:括号中的运算优先于运算符优先级。
后缀和前缀运算符的特点:++ 和 -- 不是普通的前缀式运算符,它们的计算顺序可能与你预期相反。
为了更直观地理解这些概念,我们来看看一些实际代码。
int x = 6, y = 7, z = 8;int r1 = x + y * z / 10;
理解:由于乘除优先级高于加法,y * z 会先计算,然后将结果除以 10,最后再与 x 相加。因此,计算结果为 6 + (7 * 8 / 10),即 11338。
int x = 6, y = 7, z = 8;int r2 = x + --y - ++z;
理解:由于 ++ 和 -- 的优先级高于减法和加法,--y 会被执行为 7 - 1 = 6,而 ++z 会是 8 的值先加 1(记住这一步是真的!),结果 8 + 1 = 9。不过,在这里,z 的值会受到批评,因为 ++z 表示递增(每当读取变量 z,值会被递增)。因此,表达式最终结果为 6 + 6 - 9 = 3。
int x = 6, y = 7, z = 8;int r3 = ++x + ++y + 5 << 1 | 2;
理解:++x 和 ++y 的优先级高于 << 和 +,所以它们会被先执行。表达式等价于 7 + 8 + 5 = 20,然后 20 << 1 等于 40,再用 | 2 异或,所以最终结果为 42。
boolean x1 = false, y1 = true, z1 = false;boolean r4 = x1 == y1 == z1;
理解:这里的运算符优先级是关键。根据语言规则,等式运算符 (==) 是左结合的,所以表达式等价于 (x1 == y1) == z1。首先检查 false == true?是的,不会,结果 r4 = false。
int x = 6, y = 7, z = 8;int r5 = x - ++y - ++z;
理解:同样,++ 优先级高于减法。因此,先执行 ++y 得到 7,然后再 ++z 使用 8。表达式结果为 6 - 7 - 9 = -10。
通过这些代码示例,可以清晰地看到运算符优先级如何影响最终结果。掌握这些规则是编写高效代码的关键。
转载地址:http://foryk.baihongyu.com/