为什么在“false&& counter()”中没有调用counter()?

时间:2017-06-07 13:28:47

标签: java boolean-expression

我试图弄清楚如何评估这个布尔表达式:

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为false,counter()返回false。但是,我很困惑,因为尽管num函数在布尔表达式中,静态变量counter()的值不会改变:

exp = i > 1 && counter();

我期待输出

1
false

但它是

0
false

为什么似乎没有调用counter()

3 个答案:

答案 0 :(得分:3)

这是因为&& 短路。当i > 1求值为false时,无需检查逻辑AND的另一侧,因为生成的表达式始终为false。因此,方法counter永远不会运行。

要解决此问题,您可以将counter()移至第一个条件,或使用非短路&

答案 1 :(得分:2)

  

&安培;&安培;如果左侧表达式为真,运算符将评估右侧表达式。

如果任何一个表达式为假,那么整个表达式在&&&操作员案例 - >无需评估其他表达式。所以在你的情况下,counter()表达式根本没有执行。

  

0> 1失败..

因此根本没有评估counter()。

答案 2 :(得分:0)

因为&&是快速布尔操作。 如果第一个操作数为false,则它将立即返回false而不评估第二个操作数。 您可以使用&,它将始终评估两个操作数。 (如果操作数是完整的,那么&也是一个逐位运算符。) 逻辑OR的相同之处:||。如果第一个操作数为真,它将立即返回true。