短路逻辑运算符

Java支持用于生成高效代码的短路(short-circuit)AND和OR逻辑运算符.为什么这样设计呢?在AND运算中,如果第一个操作数为假,那么无论第二个操作数是什么,运算结构都为假.在OR运算中,如果第一个操作数是真,那么无论第二个操作数是什么,云端结果都为真.因此,在这些情况下就无需对第二个操作数进行计算.不计算第二个操作数,就节省了时间,从而生成了效率更高的代码.
短路AND运算符是&&,短路OR运算符是||.而普通的AND和OR运算符分别是&和|.两者的唯一区别在于普通运算符将计算每一个操作数,而短路运算符只在必要是计算第二个操作数.
下面是一个演示短路运算符的程序.程序要确定d中的值是否是n的因数.程序利用求余运算来完成这一功能.如果n/d的余数为0,那么d是因数.然而,因为求余运算涉及除法,短路AND运算可以防止发生除0错误.
    public static void main(String args[])
    {
        int n,d,q;
        
        n = 10;
        d = 2;
        if(d != 0 && (n % d) == 0)
        {
            System.out.println(d+" is a factor of "+n);
        }
        
        d = 0;
        
        if(d != 0 && (n % d) == 0)
        {
            System.out.println(d+" is a factor of "+n);
        }
        
        if(d != 0 & (n % d) == 0)
        {
            System.out.println(d+" is a factor of "+n);
        }
    }
输出
2 is a factor of 10
Exception in thread "main" java.lang.ArithmeticException: / by zero
    at javaTest.test.main(test.java:24)
为防止出现除0错误,if语句首先检查d是否等于0,如果等于0,短路AND运算结束,不执行求余运算.因此,在第一个条件测试中d是2,执行求余运算.第二个条件测试失败,因为d为0,求余运算被跳过,以避免发生除0错误.最后一个条件测试使用了普通AND运算符.这样会计算两个操作数,在除以0时会导致运行时错误发生.
最后要注意的一点是,Java的正式规范将短路运算符称为”条件或”和”条件与”运算符,但通常还是使用短路这个词.