目前我正在开发一个具有内存密集检查过程的程序。在某些时候,代码看起来像这样。
if(isvalid() && false) //this false is acctually another method which will at this given
//point always return false
{
//rest ommited
}
JVM是否总是检查第一种方法(isValid()),因为x&&虚假是假的;
我不确定,因为调试调试器时每次迭代都跳转到isValid()方法。
答案 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());
}
它打印 假 错误