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

为何JVM会将逻辑OR转换为AND?Java代码编译疑问

为什么Java代码中的逻辑或(||)会被编译为逻辑与(&&)?

这是编译器基于德摩根定律做的等价逻辑转换,不存在基础错误,两段代码的逻辑完全一致。

原代码逻辑

if(currentValue.toString().matches(EPOCH_PATTERN.pattern()) || 
currentValue instanceof Long) 
        this.setValue(Long.valueOf(currentValue.toString()));
      else
        this.setValue(currentValue);

这段代码的逻辑可抽象为:

if (A || B) {
    执行X操作
} else {
    执行Y操作
}

其中:

  • A = currentValue.toString().matches(EPOCH_PATTERN.pattern())
  • B = currentValue instanceof Long
  • X操作 = this.setValue(Long.valueOf(currentValue.toString()))
  • Y操作 = this.setValue(currentValue)

编译后代码的逻辑等价性

根据德摩根定律,!(A || B) 等价于 !A && !B。原代码的else分支触发条件正是!(A || B),编译器直接将代码重构为先判断这个等价条件:

if (!currentValue.toString().matches(EPOCH_PATTERN.pattern()) && 
!(currentValue instanceof Long)) {
                this.setValue(currentValue);
            } else {
                this.setValue(Long.valueOf(currentValue.toString()));
            }

这段代码的逻辑为:

if (!A && !B) {
    执行Y操作
} else {
    执行X操作
}

和原代码逻辑完全一致,只是调整了条件判断的顺序,属于编译器的常规优化,不会改变代码的执行结果。

内容的提问来源于stack exchange,提问作者Deepak Gopal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 18:02:12