为什么不在 "false && counter()" 中调用 counter()?
Why isn't counter() called in "false && counter()"?
我想弄清楚这个布尔表达式是如何求值的:
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
为假,counter()
returns 为假。但是,我很困惑,因为尽管布尔表达式中有 counter()
函数,但静态变量 num
的值没有改变:
exp = i > 1 && counter();
我期望输出是
1
false
但它是
0
false
为什么counter()
好像没有被调用?
这是因为&&
短路。当 i > 1
的计算结果为 false 时,无需检查逻辑 AND 的另一端,因为结果表达式将始终为 false
。因此,方法 counter
永远不会是 运行.
要解决此问题,您可以将 counter()
移动到第一个条件,或者使用非短路 &
.
因为&&
是快速布尔运算。
如果第一个操作数为 false,那么它将立即 return false 而不评估第二个操作数。
您可以使用 &
,它将始终评估两个操作数。 (如果操作数是整数,&
也是按位运算符。)
与逻辑 OR 相同:||
。如果第一个操作数为真,它将立即返回真。
&& operator evaluates the right side expression if the left side expression is true.
如果任何一个表达式为假,则在 && 运算符情况下整个表达式将为假 -> 无需评估其他表达式。所以 counter() 表达式在你的情况下根本没有执行。
0 > 1 fails..
因此 counter() 根本没有计算。
我想弄清楚这个布尔表达式是如何求值的:
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
为假,counter()
returns 为假。但是,我很困惑,因为尽管布尔表达式中有 counter()
函数,但静态变量 num
的值没有改变:
exp = i > 1 && counter();
我期望输出是
1
false
但它是
0
false
为什么counter()
好像没有被调用?
这是因为&&
短路。当 i > 1
的计算结果为 false 时,无需检查逻辑 AND 的另一端,因为结果表达式将始终为 false
。因此,方法 counter
永远不会是 运行.
要解决此问题,您可以将 counter()
移动到第一个条件,或者使用非短路 &
.
因为&&
是快速布尔运算。
如果第一个操作数为 false,那么它将立即 return false 而不评估第二个操作数。
您可以使用 &
,它将始终评估两个操作数。 (如果操作数是整数,&
也是按位运算符。)
与逻辑 OR 相同:||
。如果第一个操作数为真,它将立即返回真。
&& operator evaluates the right side expression if the left side expression is true.
如果任何一个表达式为假,则在 && 运算符情况下整个表达式将为假 -> 无需评估其他表达式。所以 counter() 表达式在你的情况下根本没有执行。
0 > 1 fails..
因此 counter() 根本没有计算。