如果(条件和&& false)语句,JVM如何运行?

时间:2013-08-17 15:18:08

标签: java performance jvm

目前我正在开发一个具有内存密集检查过程的程序。在某些时候,代码看起来像这样。

if(isvalid() && false) //this false is acctually another method which will at this given 
                       //point always return false
{
    //rest ommited
}

JVM是否总是检查第一种方法(isValid()),因为x&&虚假是假的;

我不确定,因为调试调试器时每次迭代都跳转到isValid()方法。

4 个答案:

答案 0 :(得分:8)

始终会检查isValid()&&的语义是评估左侧部分,并且只有true查看右侧部分。

答案 1 :(得分:3)

JVM始终首先评估&&||的左侧,然后仅在必要时评估右侧。如果您认为&&右侧的操作更有可能返回false,那么您应该将它们切换并放在第一位。

更多细节: http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.23

  

在运行时,首先计算左侧操作数表达式;如果   结果具有类型布尔值,它将进行拆箱转换   (§5.1.8)。

     

如果结果值为false,则条件的值为   expression是false而右边的操作数表达式不是   评价。

答案 2 :(得分:0)

如果查看由JDK生成的字节码,你会发现如果省略了块内容t。

if(isValid() && false){
    System.out.print("qqq");
}
System.out.print("www");

字节码:

0: invokestatic  #2                  // Method isValid:()Z
3: ifeq          6                  // no if block content!!!
6: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
9: ldc           #4                  // String www
11: invokevirtual #5                  // Method java/io/PrintStream.print:(Ljava/lang/String;)V

将调用方法,但不会影响分支逻辑。

答案 3 :(得分:0)

public static void main(String[] args) {

    Stack<Boolean> nums = new Stack<>();
    nums.push(true);
    System.out.println(nums.pop() && false);
    System.out.println(nums.isEmpty());

    nums.push(true);
    System.out.println(false && nums.pop());
    System.out.println(nums.isEmpty());
}

它打印 假 真正 假 错误

使用假&&或||时应小心。在您的代码中,有时为不会使用这种情况,但是在以下情况下我们可能会使用;

public static void main(String[] args) {

    Stack<Boolean> nums = new Stack<>();
    nums.push(true);
    nums.push(false);
    System.out.println(nums.pop() && nums.pop());
    System.out.println(nums.isEmpty());

}

它打印 假 错误