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);
七、运算符的优先级

- 优先级不用记忆,用久就熟悉了
- 可分类了解
运算符:
1、运算符有不同的优先级,所谓的优先级就是表达式运算中的运算顺序。
2、只有单目运算符、赋值运算符是从右往左边运算的。
对于运算符的优先级进行分类,有一个大致的印象:
() {}等
单目运算符
算术运算符
位移运算符
比较运算符
逻辑运算符
三元运算符
赋值运算符

浙公网安备 33010602011771号