Java运算符优先级应结合结合性与从左到右求值理解;易错点包括==与&&混用、+的双语义歧义、赋值运算符右结合性,以及++/–副作用时机混淆。
Java 运算符优先级不是靠死记,而是靠「结合性 + 从左到右求值顺序」推出来的;真正容易出错的不是优先级本身,而是 == 和 && 混用、+ 的重载歧义、以及赋值类运算符(如 =、+=)的右结合特性。
为什么 a = b == c 不等于 (a = b) == c
因为 == 优先级高于 =,所以 a = b == c 实际等价于 a = (b == c) —— 先算布尔比较,再把 true 或 false 赋给 a。如果 a 是 int 类型,编译直接报错:incompatible types: boolean cannot be converted to int。
常见误写场景:
- 想判断并赋值:误写成
if (flag = someMethod())(少了个=),实际执行了赋值而非比较 - 链式比较意图:写
a == b == c,但 Java 不支持三元布尔链式,它会被解析为(a == b) == c,而(a == b)是boolean,c是整数 → 编译失败 - 条件表达式嵌套:如
result = a > 0 && b ,注意&&优先级低于?:,所以无需额外括号;但若写成a > 0 ? x : y || z,||会先于?:参与运算,逻辑错乱
+ 在字符串拼接和数值相加中的歧义怎么破
+ 是唯一严重依赖操作数类型的双语义运算符:两边都是数字 → 算术加法;任一边是 String → 字符串拼接;且从左到右逐个计算,不看整体。
立即学习“Java免费学习笔记(深入)”;
示例:
System.out.println(1 + 2 + "3"); // 输出 "33"(先 1+2=3,再 "3"+"3" → "33")
System.out.println("1" + 2 + 3); // 输出 "123"("1"+2 → "12",再 +"3" → "123")
System.out.println(1 + "2" + 3); // 输出 "123"
关键点: