为什么java在编译时还原逻辑运算符

为什么java在编译时还原逻辑运算符,java,Java,实际的java代码是: ((rrd == null || !rrd) && null != dam && null != dam.getac() && null != dam.getac().getc() && null != sname && sname.equalsIgnoreCase(dam.getac().getc())) 但当我查看类文件时,它是: ((rrd

实际的java代码是:

((rrd == null || !rrd) 
    && null != dam
    && null != dam.getac()
    && null != dam.getac().getc() 
    && null != sname 
    && sname.equalsIgnoreCase(dam.getac().getc()))
但当我查看类文件时,它是:

((rrd != null) && (rrd.booleanValue())) 
    || ((((null == dam) 
    || (null == dam.getac()) 
    || (null == dam.getac().getc()) 
    || (null == sname) 
    || (!(sname.equalsIgnoreCase(dam.getac().getc()))))))
所有
|
&
互换

有人能解释一下原因吗?

参见:


!!A | | |!B==!(A和B)

表达式不是等价的,而是颠倒的。看起来编译器避免了一个外部(或隐含的)错误


请注意,短路对于两种操作都是可能的,
|
&
——在第一种情况下,当遇到真子表达式时,以及在第二种情况下,当遇到假子表达式时。因此,短路能力本身并不能解释这一点

我想OP知道这一点!A | | |!B==!(A和B)。但问题是为什么编译器会将其更改为此。通常情况下,编译器会执行此类操作以优化性能,因为某些操作的执行速度可能比其他操作快。我不认为这是一种优化—我认为OP使用的反编译器无法区分这两者之间的差异,或者它编译成完全相同的字节码。请你在问题中添加以下内容:1)至少大致类型的rrd、dam、sname;2) javap输出,而不是您的反向工程版本。谢谢。因为或操作可能会短路。如果第一个或第二个为真,则整个逻辑运算为真。此外,您不应该编写这样复杂的逻辑语句。它们太复杂了,人类无法理解。Hi Koshinae,
rrd
dam
sname
分别是
Boolean
java实体
String