71-80逻辑运算符/取反/赋值运算符/三元运算符/运算符的优先级

一、短路与&&和逻辑与&

名称 语法 特点
短路与&& 条件1&&条件2 两个条件都为true,结果为true
逻辑与& 条件1&条件2 两个条件都为true,结果为true

好像这两个的结果都是一样的,到底有什么区别?
编写程序来说明LogicOperator01.java
主要的区别在于一个支持短路,一个不支持短路

// LogicOperator01.java
public class LogicOperator01 {
    public static void main(String[] args) {
        // 1、先验证两个的特点
        if (1 < 2 && 2 < 3) {
            System.out.println("ok 100~");  // 会打印
        }
        if (1 < 2 & 2 < 3) {
            System.out.println("ok 200~");  // 会打印
        }

        // 2、验证两者的区别
        int a = 10;
        int b = 20;
        if (a < 5 && ++b > 15) {  // 条件2不会被执行,短路了
            System.out.println("ok 1000");
        }
        System.out.println("a = " + a);
        System.out.println("b = " + b);

        if (a < 5 & ++b > 15) {  // 条件2也会被执行,b先加1然后b为21和15比较
            System.out.println("ok 2000");
        }
        System.out.println("a = " + a);
        System.out.println("b = " + b);
    }
}
  • 总结
    1、&&短路与:如果第一个条件为false,则第二个条件不会判断,最终条件为false,效率高;
    2、&逻辑与:不管第一个条件是否是false,第二个条件都会判断,效率低;
    3、开发中,我们使用的基本是使用短语与&&,效率高。

二、短路或||和逻辑或

名称 语法 特点
短路或|| 条件1||条件2 两个条件中只要有一个成立,结果为true,否则为false
逻辑或| 条件1|条件2 只要有一个条件成立,结果为true,否则为false

同理通过案例演示
LogicOperator02.java

// LogicOperator02.java
public class LogicOperator02 {
    public static void main(String[] args) {
        // 1、共同点
        if (1 < 2 || 2 < 0) {
            System.out.println("ok 100");
        }
        if (1 < 0 || 0 < 2) {
            System.out.println("ok 200");
        }
        if (1 < 2 || 0 < 2) {
            System.out.println("ok 300");
        }
        if (1 < 2 | 2 < 0) {
            System.out.println("ok 100");
        }
        if (1 < 0 | 0 < 2) {
            System.out.println("ok 200");
        }
        if (1 < 2 | 0 < 2) {
            System.out.println("ok 300");
        }

        // 2、不同点(短路特性)
        int a = 10;
        int b = 1;
        if (a < 15 || ++b > 5) {
            System.out.println("ok 1000");
        }
        System.out.println("a = " + a);
        System.out.println("b = " + b);
        if (a < 15 | ++b > 5) {
            System.out.println("ok 2000");
        }
        System.out.println("a = " + a);
        System.out.println("b = " + b);
    }
}
  • 总结
    1、短路或:如果第一个条件为true,则第二个条件不会判断,最终结果为true,效率高;
    2、逻辑或:不管第一个条件是否为true,第二个条件都要判断,效率低;
    3、开发中,常常使用||

三、取反!和逻辑异或^

名称 语法 特点
!非(取反) !条件 如果条件本身成立,结果为false,否则为true
^逻辑异或 条件1^条件2 当a和b不同时,则结果为true,否则为false

同理使用例子说明
InverseOperator.java

// InverseOperator.java
public class InverseOperator {
    public static void main(String[] args) {
        System.out.println(3 > 2);  // true
        System.out.println(!(3 > 2));  // false

        System.out.println((3 > 2) ^ (2 > 5));  // true false => true
    }
}

四、练习

public class Test01 {
    public static void main(String[] args) {
        // 1、请写出每个题的输出结果
        int x = 5;
        int y = 5;
        if (x++ == 6 & ++y==6) {  // x != 6 x = 6 false => y = 6 y == 6 true => false
            x = 11;  // 不执行
        }
        System.out.println("x = " + x + ",y = " + y);  // x = 6,y = 6

        // 2、第二题
        int x2 = 5,y2 = 5;
        if (x2++ == 6 && ++y2 == 6) {  // false x2 = 6, 不执行
            x2 = 11;  // 不执行
        }
        System.out.println("x2 = " + x2 + ",y2 = " + y2);  // x2 = 6,y2 = 5

        // 3、第三题
        int x3 = 5,y3 = 5;
        if (x3++ == 5 | ++y3==5) {  // true x3 = 6,y3 = 6 false => true
            x3 = 11;  // x3 = 11,y3 = 6
        }
        System.out.println("x3 = " + x3 + ",y3 = " + y3);

        // 4、第四题
        int x4 = 5,y4 = 5;
        if (x4++ == 5 || ++y4 == 5) {  // true x4 = 6,不执行
            x4 = 11;  // x4 = 11, y4 = 5
        }
        System.out.println("x4 = " + x4 + ",y4 = " + y4);
    }
}

public class Test02 {
    public static void main(String[] args) {
        boolean x = true;
        boolean y = false;
        short z = 46;
        if ((z++ == 46) && (y = true)) z++;  // true z = 47, true => true z = 48
        if ((x = false) || (++z == 49)) z++;  // false, z = 49 true => true z = 50
        System.out.println("z = " + z);  // z = 50
    }
}

五、赋值运算符

赋值运算符介绍:
	赋值运算符就是将某个运算后的值赋给指定的变量。
赋值运算符的分类:
	基本赋值运算符 = 
	复合赋值运算符
		+= -= *= /= %=等,这些复合赋值运算符是一个道理
		a += b; 等价于 a = a + b;
赋值运算符的特点:
	1、运算顺序是从右往左的,int num = a + b + c;
	2、赋值运算符的左边只能是变量,右边可以是变量,表达式,常量值
	3、复合赋值运算符等价于下面的效果
		a += 3; 等价于 a = a + 3;
	4、复合赋值运算符会进行类型的转换
		byte b = 3;
		b += 2; // 等价于 b = (byte)(b + 2),如果直接进行混合运算最后的结果是最大的类型,即int
		b++;  // 也是一样,底层进行了类型转换 b = (byte)(b + 1)

六、三元运算符

三元运算符基本语法:
	条件表达式?表达式1:表达式2;
	1、如果条件表达式为true,运算后的结果是表达式1
	2、如果条件表达式为false,运算后的结果是表达式2
	口诀:一真大师
	三元运算符使用细节
	// 细节1、表达式1和表达式2要为可以赋给接口变量的类型
	int a = 3;
	int b = 8;
	double c = a > b ? 1.1: 3.4;
	
	// 细节2、可以自动类型转换
	int a = 3;
	int b = 8;
	double c = a > b ? a: b;
	
	// 细节3、三元运算符的本质就是if else三元运算符可以转换成为if else
	int res = a > b? a++; --b;
	// 相当于
	if (a > b) a++;
	else --b;
// 使用三元运算符求解三个数中的最大值
int n1 = 553;
int n2 = 33;
int n3 = 123;
// 思路
// 1、先得到n1和n2中的最大数,保存到max1
// 2、然后再求出max1和n3中的最大数,保存到max2
int max1 = n1 > n2 ? n1: n2;
int max2 = max1 > n3 ? max1: n3;
System.out.println("最大数=" + max2);
// 使用一条语句实现
int max = (n1 > n2 ? n1: n2) > n3 ? (n1 > n2 ? n1: n2) : n3;
System.out.println("最大数=" + max);

七、运算符的优先级

image

  • 优先级不用记忆,用久就熟悉了
  • 可分类了解
运算符:
	1、运算符有不同的优先级,所谓的优先级就是表达式运算中的运算顺序。
	2、只有单目运算符、赋值运算符是从右往左边运算的。
	对于运算符的优先级进行分类,有一个大致的印象:
		() {}等
		单目运算符
		算术运算符
		位移运算符
		比较运算符
		逻辑运算符
		三元运算符
		赋值运算符
posted @ 2025-04-27 16:07  请叫我虾  阅读(39)  评论(0)    收藏  举报