为何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
相关产品推荐
相关产品推荐

