我试图弄清楚如何评估这个布尔表达式:
int i = 0;
boolean exp = i > 1 && counter();
在以下代码中:
public class Main {
static int num = 0;
public static boolean counter(){
num++;
if(num == 6){
return true;
}
return false;
}
public static void main(String[] args) {
//int i = 2;
int i = 0;
boolean exp = i > 1 && counter();
System.out.println(num); // 0
System.out.println(exp); // false
}
}
由于i = 0
,i > 1
为false,counter()
返回false。但是,我很困惑,因为尽管num
函数在布尔表达式中,静态变量counter()
的值不会改变:
exp = i > 1 && counter();
我期待输出
1
false
但它是
0
false
为什么似乎没有调用counter()
?
答案 0 :(得分:3)
这是因为&&
短路。当i > 1
求值为false时,无需检查逻辑AND的另一侧,因为生成的表达式始终为false
。因此,方法counter
永远不会运行。
要解决此问题,您可以将counter()
移至第一个条件,或使用非短路&
。
答案 1 :(得分:2)
&安培;&安培;如果左侧表达式为真,运算符将评估右侧表达式。
如果任何一个表达式为假,那么整个表达式在&&&操作员案例 - >无需评估其他表达式。所以在你的情况下,counter()表达式根本没有执行。
0> 1失败..
因此根本没有评估counter()。
答案 2 :(得分:0)
因为&&
是快速布尔操作。
如果第一个操作数为false,则它将立即返回false而不评估第二个操作数。
您可以使用&
,它将始终评估两个操作数。 (如果操作数是完整的,那么&
也是一个逐位运算符。)
逻辑OR的相同之处:||
。如果第一个操作数为真,它将立即返回true。