问题描述
- Java逻辑运算的字节码
-
测试代码如下:public class TestXLogic { public boolean xand (boolean b1, boolean b2) { return b1 && b2; } public boolean xor (boolean b1, boolean b2) { return b1 || b2; } /** * @param args */ public static void main(String[] args) { TestXLogic logic = new TestXLogic(); boolean b1 = true, b2 = false; if (logic.xand(b1, b2) || logic.xor(b1, b2) && b2 ) { System.out.println("haha"); } } }
编译后,main方法里if条件部分是这样的:
15 invokevirtual com.dicp.flow.test.TestXLogic.xand(boolean, boolean) : boolean [24] 18 ifne 34 21 aload_1 [logic] 22 iload_2 [b1] 23 iload_3 [b2] 24 invokevirtual com.dicp.flow.test.TestXLogic.xor(boolean, boolean) : boolean [26] 27 ifeq 42 30 iload_3 [b2] 31 ifeq 42 34 getstatic java.lang.System.out : java.io.PrintStream [28] 37 ldc <String "haha"> [34]
为什么18行会是ifne 34呢?实际上这里哪怕执行了15行,结果是true,但还需要运行后面&& b2才得到最终结果,而不应该是直接跳到34输出
解决方案
|| 是**短路**或运算,只要 xand() 为真就执行 println(),很正确啊。
解决方案二:
||和&&不是平级的,&&要高于||的运算级别,因此是先执行的后面的判断,结果为logic.xor(b1, b2) && b2先判断为false,再与前面的false判断,还是false。
解决方案三:
只要 xand() 为真就执行 println()
时间: 2016-05-18