为什么不在 "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 = 0i > 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() 根本没有计算。