You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

核心误区:运算符优先级≠求值顺序

你混淆了两个关键概念:运算符优先级和表达式求值顺序,以及逻辑或||的短路求值规则,具体拆解如下:

  1. 运算符优先级的作用:确定表达式分组
    根据Java运算符优先级,++(无论前置还是后置)优先级高于==,==优先级高于||。所以你的表达式会被解析为:

    (++a == 11) || (b++ == 12)
    

    优先级只是决定表达式的语法结构(即操作数与运算符的归属关系),并不决定各分组的执行顺序。

  2. 逻辑或||的短路求值规则
    Java中||是短路逻辑或,执行规则非常明确:

    • 严格从左到右先求值左操作数(即++a == 11)
    • 如果左操作数结果为true,直接返回true,完全跳过右操作数的求值过程(也就是b++ == 12根本不会被执行)

    对应到你的代码:

    • 左操作数执行时,a先自增为11,判断11 == 11结果为true
    • 触发短路规则,右操作数的b++自增操作完全没机会运行,b保持初始值12
  3. 纠正你的错误预期
    你误以为后置自增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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 17:53:15