& 与 && 、| 与 || ,傻傻分不清???

逻辑运算符

逻辑运算符用来表示日常交流中的“并且”,“或者”,“除非”等思想。&(与)、|(或)、!(非)、&&(短路与)、||(短路或)、^(异或)都是java中的逻辑运算符,具体用法见下表:

逻辑运算符 名称 示例 作用
& a & b a,b都为真,则结果为真,反之,a,b都为假,则结果为假
| a | b a,b有一个为真,则结果为真
!a a为真则结果为真,a为假则结果为假
&& a && b a,b都为真,则结果为真
|| a || b a,b有一个为真,则结果为真
^ 异或 a ^ b a,b都为真,或都为假时,结果为假

&和&&

&与&&都表示逻辑与,它们的区别在于&需要判断左右两边的值才能确定整个表达式的值。而&&有时只需判断左边的值就可以确定整个表达式的值,当左边的值为false时,就不需要判断右边的值了,此时整个表达式的值为false。当左边的值为true时,此时需要判断右边的值了,若右边的值为true,此时整个表达式的值为true,若右边的值为false时,此时整个表达式的值为false。

结合下面的代码可以有更好地理解:

/**
 * @Description:
 * @Author: 小强
 * @Date: 2021/5/11 0011
 * @Tools: IntelliJ IDEA
 * @Remember: Be professional every day
 **/
public class Demo01 {
    public static void main(String[] args) {
        if (A() & C()) {        //A()方法和C()方法作逻辑与运算
            System.out.println("结果是真!!!");
        } else {
            System.out.println("结果是假!!!");
        }
    }

    public static boolean A() {
        System.out.println("我是方法A");
        return true;
    }

    public static boolean B() {
        System.out.println("我是方法B");
        return false;
    }

    public static boolean C() {
        System.out.println("我是方法C");
        return true;
    }
}

上面的代码中定义了3个方法,A方法和C方法都返回true,B方法返回false,在主方法中使用if语句将A方法和C方法做逻辑与&运算,根据&的运算法则,需要判断左右两边的值才能确定整个表达式的值,A方法和C方法都为真,那么结果应该为真。执行结果如下:

从执行结果可以看到,控制台输出了A方法和C方法中的输出语句,说明&左右两边都执行了,还输出了“结果为真”,说明两边为真则结果为真。

同理,修改主方法中if语句中的表达式,将A方法和B方法做&运算,结果如下:

说明左右两边有一边为假,则结果为假。

交换if语句中A()和B()的位置,

public static void main(String[] args) {
        if (B() & A()) {
            System.out.println("结果是真!!!");
        } else {
            System.out.println("结果是假!!!");
        }
    }

执行结果如下:

接下来我们看&&逻辑运算符

修改主方法中if语句中的表达式,将A()方法和B()方法作&&(短路与)运算

public static void main(String[] args) {
        if (A() && B()) {
            System.out.println("结果是真!!!");
        } else {
            System.out.println("结果是假!!!");
        }
    }

执行结果如下:

将A()方法和B()方法位置调换:

public static void main(String[] args) {
        if (B() && A()) {
            System.out.println("结果是真!!!");
        } else {
            System.out.println("结果是假!!!");
        }
    }

只是调换了一下位置,结果就不一样了。是因为&&运算符在判断左边的值时,左边的值为false,就不用判断右边的值了,整个表达式的值为false。所以只执行了B方法中的输出语句,A方法没有执行。可以对比上面的A()和B()做&运算的结果(下图),&运算左右两边都执行了,&&只执行了左边。

| 和 ||

| 和 || 都表示逻辑或,其用法跟&和&&差不多, || 的运算法则是当左边的值为true时,就不用判断右边了,整个表达式结果为tru。若左边为false,需要判断右边的值,右边为true,则整个表达式结果为true,右边为false,则则整个表达式结果为false。

结合代码理解,修改上面的代码:

public static void main(String[] args) {
        if (A() | B()) {
            System.out.println("结果是真!!!");
        } else {
            System.out.println("结果是假!!!");
        }
    }

结果如下:

| 运算一边为真,则结果为真。做 || 运算结果如下:

左边为true,右边不用判断,所以没有执行B方法。调换if中A()和B()的位置,结果如下:

左边为false,需要判断右边,右边为true,所以结果为true,两个方法都执行了。

逻辑运算符的优先顺序

逻辑非的优先级最高,逻辑与次之,逻辑或最低,即:!(非) → &&(与) → ||(或)

分析下面代码:

public static void main(String[] args) {
        if (B() || A() && C()) {
            System.out.println("结果是真!!!");
        } else {
            System.out.println("结果是假!!!");
        }
    }

若按照优先顺序,先运算 A() && C(),之后B()再和(A() && C())的结果做短路或(||)运算

执行结果:

执行的结果时按照左右顺序来的????????
我表示一脸懵!!待研究······

posted @ 2021-05-18 15:30  XQ-Yang  阅读(1036)  评论(0编辑  收藏  举报