Java运算符优先级决定表达式计算顺序,如a+bc先算bc;括号是唯一覆盖默认优先级的方式;++/--需区分前缀后缀及结合性;字节码验证最可靠。

Java里运算符优先级怎么影响表达式结果
Java按固定优先级表决定哪些运算先算,不是简单从左到右。比如 a + b * c 一定先算 b * c,哪怕 + 写在前面。忽略这点,结果常和预期不符。
- 乘除模(
*、/、%)优先级高于加减(+、-) - 赋值运算符(
=、+=等)优先级最低,总是最后执行 - 逻辑与(
&&)优先级高于逻辑或(||),但都低于关系运算符(>、==等) - 一元运算符(如
++、!、-)优先级很高,常被误认为和二元运算一样处理
什么时候必须加括号来控制顺序
括号不是可有可无的装饰——它是唯一能覆盖默认优先级的方式。尤其在混合算术、关系和逻辑运算时,不加括号极易出错。
-
if (a + b > c && d == e)没问题,因为+和>本身就有明确先后 -
if (a & b == c)有风险:==优先级高于&(按位与),实际等价于if (a & (b == c)),几乎肯定不是本意 -
return flag ? x + y : z * w;安全;但return flag ? x + y : z == w;中,==会先于三元运算符绑定,需写成return flag ? x + y : (z == w);
自增/自减运算符的结合性容易被忽略
++ 和 -- 分前缀和后缀,不仅优先级高,还涉及求值时机。这不是优先级问题,而是结合性+副作用共同作用的结果。
-
i++ + i的行为未定义(不同JVM可能不同),因为同一表达式中对i读写冲突 -
arr[i++] = i;中,数组索引用的是旧值,但赋值右边是新值,结果不可预测 - 前缀形式(
++i)返回自增后的值;后缀(i++)返回自增前的值——这个“返回值”参与后续运算,而非仅改变变量本身
int x = 5; int y = ++x * 2; // x 先变 6,再算 6 * 2 → y = 12 int z = x++ * 2; // 先用 x=6 算 6 * 2 = 12 赋给 z,再 x 变 7 // 所以 y=12, z=12, x=7
用 javap 看字节码验证你的理解
编译器不会“猜”你想怎么算。它严格按优先级+结合性拆解表达式。如果不确定某个复杂表达式怎么执行,最可靠的办法是看字节码。
立即学习“Java免费学习笔记(深入)”;
- 写个简单类,含目标表达式,用
javac Test.java编译 - 运行
javap -c Test,观察指令顺序:比如iadd、imul出现的先后,直接反映计算顺序 - 特别注意
iload指令调用几次、在哪个运算前——这暴露了操作数取值时机
真正难的不是记住所有15级优先级,而是意识到:只要表达式里出现超过一种运算符,就必须主动确认结合路径,而不是依赖“看起来顺”。括号不是懒惰的替代品,是表达意图的最小必要符号。










