2

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

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

JVM 是否总是检查第一个方法(isValid()),因为 x && false 是 false;

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

4

4 回答 4

9

它会一直检查isValid()。的语义&&是评估左侧部分,并且仅当它是true查看右侧部分时。

于 2013-08-17T15:20:35.963 回答
3

&&JVM 总是先评估or的左侧||,然后仅在必要时评估右侧。如果你认为an右边的操作&&更有可能返回false,那么你应该把它们调换一下,把它放在第一位。

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

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

如果结果值为 false,则条件与表达式的值为 false,并且不计算右侧操作数表达式。

于 2013-08-17T15:21:32.043 回答
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

方法将被调用,但对分支逻辑没有影响。

于 2013-08-18T12:32:36.570 回答
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());
}

它打印 false true false false

使用 false && 或 ture 时要小心 || 在你的代码中,有时“为”不会像这种情况下使用,但下面的情况我们可能会使用;</p>

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());

}

它打印 false false

于 2020-03-12T03:57:01.533 回答