Java中pre-increment与post-increment优先级及逻辑或短路求值疑问
关于Java逻辑或短路求值与运算符优先级的疑问解答
你的测试代码:
package test; public class Test { public static void main(String [] args) { int a = 10; int b = 12; System.out.println( ++a == 11 || b++ == 12); System.out.println("a= "+a); System.out.println("b= "+b); } }
实际运行输出:
true a= 11 b= 12
核心误区:运算符优先级≠求值顺序
你混淆了两个关键概念:运算符优先级和表达式求值顺序,以及逻辑或||的短路求值规则,具体拆解如下:
运算符优先级的作用:确定表达式分组
根据Java运算符优先级,++(无论前置还是后置)优先级高于==,==优先级高于||。所以你的表达式会被解析为:(++a == 11) || (b++ == 12)优先级只是决定表达式的语法结构(即操作数与运算符的归属关系),并不决定各分组的执行顺序。
逻辑或
||的短路求值规则
Java中||是短路逻辑或,执行规则非常明确:- 严格从左到右先求值左操作数(即
++a == 11) - 如果左操作数结果为
true,直接返回true,完全跳过右操作数的求值过程(也就是b++ == 12根本不会被执行)
对应到你的代码:
- 左操作数执行时,
a先自增为11,判断11 == 11结果为true - 触发短路规则,右操作数的
b++自增操作完全没机会运行,b保持初始值12
- 严格从左到右先求值左操作数(即
纠正你的错误预期
你误以为后置自增b++优先级高会先执行,但优先级只是确定表达式的分组逻辑,而短路规则直接让右半部分的分组失去了执行机会。只有当左操作数结果为false时,右操作数才会被求值,此时b++才会执行。
举个反例验证:如果把代码改成System.out.println( ++a == 12 || b++ == 12);,左操作数++a ==12结果为false,右操作数会被执行——b先参与判断12==12为true,随后自增为13,最终输出true、a=11、b=13。
内容的提问来源于stack exchange,提问作者Mustafa Quraishi
相关产品推荐
相关产品推荐

