为什么java在编译时还原逻辑运算符
实际的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
((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
。