Day04
1.逻辑运算符
理解:
符号:
&与 &&短路与 |或 ||短路或 ^异或 !非 注意:
1.逻辑运算符运行结果都是boolean类型
2.&、&&、|、||、^ 两侧都是boolean类型数据
3.!为非,就是置反,true变成false,false变成true
使用:
(1)&与、&&短路与
&与:前后两侧接boolean值,两者都为true,结果才为true
&&短路与:前后两侧接boolean值,两者都为true,结果才为true
ps:
System.out.println(true & true);//true
System.out.println(false & true);//false
System.out.println(true & false);//false
System.out.println(false & false);//false
& vs &&
&与:判断前者为false后,还会判断后者
&&短路与:判断前者为false后,不会判断后者,效率更高
(2)|或、||短路或
|或:前后两侧接boolean值,两者有一个为true,结果就为true
||短路或:前后两侧接boolean值,两者有一个为true,结果就为true
| vs ||
|或:判断前者为true后,还会判断后者
||短路或:判断前者为true后,不会判断后者,效率更高
(3)ArithmeticException - 算数异常
System.out.println(false && 10/0>5);
System.out.println(true || 10/0>5);
(4)^异或
^异或:前后两侧接boolean值,两者不同为true,相同为false
(5)!非:置反
boolean bool1 = true;
System.out.println(!bool1);//false
//& vs &&
//&与:判断前者为false后,还会判断后者
//&&短路与:判断前者为false后,不会判断后者,效率更高
//ArithmeticException - 算数异常
System.out.println(false && 10/0>5);
//|或:前后两侧接boolean值,两者有一个为true,结果就为true
System.out.println(true | true);//true
System.out.println(false | true);//true
System.out.println(true | false);//true
System.out.println(false | false);//false
//||短路或:前后两侧接boolean值,两者有一个为true,结果就为true
System.out.println(true || true);//true
System.out.println(false || true);//true
System.out.println(true || false);//true
System.out.println(false || false);//false
//| vs ||
//|或:判断前者为true后,还会判断后者
//||短路或:判断前者为true后,不会判断后者,效率更高
System.out.println(true || 10/0>5);
//^异或:前后两侧接boolean值,两者不同为true,相同为false
System.out.println(true ^ true);//false
System.out.println(false ^ true);//true
System.out.println(true ^ false);//true
System.out.println(false ^ false);//false
//!非:置反
boolean bool1 = true;
System.out.println(!bool1);//false
boolean bool2 = false;
System.out.println(!bool2);//true
练习题
在cmd窗口输入一个数字,判断是否在50~100的区间内
Scanner scan = new Scanner(System.in);
System.out.println("请输入数字:");
int num = scan.nextInt();
boolean bool = num>=50 && num<=100;
System.out.println("该数字是否在50~100的区间内:" + bool);
scan.close();
2.字符串拼接符
理解:
符号:+
注意:
+两侧都是数值,此符号为算数运算符
+两侧有一侧或两侧都是字符串,此符号字符串拼接符
使用:
System.out.println(1 + 2 + "abc" + "def" + 1 + 2);
// 3 + "abc" + "def" + 1 + 2
// "3abc" + "def" + 1 + 2
// "3abcdef" + 1 + 2
// "3abcdef1" + 2
// "3abcdef12"
3.三目运算符(三元运算符)
表达式
5+6 算数表达式
5>6 关系表达式
理解:
Java中的三目运算符也称为条件运算符,是一种简单的条件语句,可以用于替代if-else语句中简单的判断条件
语法规则:
一个判断条件,一个true结果和一个false结果。
变量 = (表达式)?值1:值2;
注意:表达式的结果必须是boolean
true - 将值1赋值给变量
false - 将2赋值给变量
需求
需求1:在控制台输入2个int类型的数字,输出最大值
Scanner scan = new Scanner(System.in);
System.out.println("请输入第一个数字:");
int a = scan.nextInt();
System.out.println("请输入第二个数字:");
int b = scan.nextInt();
int max = (a>b)?a:b;
System.out.println("最大值为:" + max);
需求2:在控制台输入3个int类型的数字,输出最大值
Scanner scan = new Scanner(System.in);
System.out.println("请输入第一个数字:");
int a = scan.nextInt();
System.out.println("请输入第二个数字:");
int b = scan.nextInt();
System.out.println("请输入第三个数字:");
int c = scan.nextInt();
int max = (a>b)?a:b;
max = (max>c)?max:c;
System.out.println("最大值为:" + max);
需求3:在控制台输入2个int类型的数字,输出最小值
Scanner scan = new Scanner(System.in);
System.out.println("请输入第一个数字:");
int a = scan.nextInt();
System.out.println("请输入第二个数字:");
int b = scan.nextInt();
int min = (a<b)?a:b;
System.out.println("最小值为:" + min);
需求4:在控制台输入3个int类型的数字,由小到大输出
Scanner scan = new Scanner(System.in);
System.out.println("请输入第一个数字:");
int a = scan.nextInt();
System.out.println("请输入第二个数字:");
int b = scan.nextInt();
System.out.println("请输入第三个数字:");
int c = scan.nextInt();
//最大值
int max = (a>b)?a:b;
max = (max>c)?max:c;
//最小值
int min = (a<b)?a:b;
min = (min<c)?min:c;
//中间值
int mid = a+b+c-max-min;
System.out.println(min + "<" + mid + "<" + max);
面试题
扩展面试题1:
int a = 5;
System.out.println((a<5)?10.9:9);//9.0
扩展面试题2:
char x = 'x';//Unicode - 120
int i = 10;
System.out.println(false?i:x);//120
扩展面试题3:
char x = 'x';//Unicode - 120
System.out.println(false?100:x);//x
System.out.println(false?100000:x);//120
扩展 - 常量:
程序执行过程中不可发生改变的量
注意:数字字面量就是常量的一种
三目运算符的返回值规则:
1.值1和值2都是常量的情况,按照取值范围大的类型返回数据
2.值1和值2都是变量的情况,按照取值范围大的类型返回数据
3.值1和值2一个是常量一个是变量的情况,判断常量是否在变量所属的取值范围内
在 - 按照变量的类型返回数据
不在 - 按照常量的类型返回数据
4.位运算符
理解:
将十进制的数据转换为二进制再做运算
符号:
&与 |或 ^异或
<<左移 >>右移 >>>无符号位右移
使用(运算过程,考虑转型)
&与:
同位比较,两者为1,结果才为1
byte b1 = 23;//0001,0111
byte b2 = 27;//0001,1011
//0001,0011
//b1 - byte:0001,0111
// int:0000,0000,0000,0000,0000,0000,0001,0111
//b2 - byte:0001,1011
// int:0000,0000,0000,0000,0000,0000,0001,1011
// 结果:0000,0000,0000,0000,0000,0000,0001,0011
// (byte):0001,0011
byte result = (byte)(b1 & b2);
System.out.println(result);//19 - 0001,0011
|或:
同位比较,两者有1,结果就为1
byte b1 = 23;//0001,0111
byte b2 = 27;//0001,1011
//0001,1111
//b1 - byte:0001,0111
// int:0000,0000,0000,0000,0000,0000,0001,0111
//b2 - byte:0001,1011
// int:0000,0000,0000,0000,0000,0000,0001,1011
// 结果:0000,0000,0000,0000,0000,0000,0001,1111
// (byte):0001,1111
byte result = (byte)(b1 | b2);
System.out.println(result);//31 - 0001,1111
^异与:
同位比较,两者相同为0,不同为1
byte b1 = 23;//0001,0111
byte b2 = 27;//0001,1011
//0000,1100
//b1 - byte:0001,0111
// int:0000,0000,0000,0000,0000,0000,0001,0111
//b2 - byte:0001,1011
// int:0000,0000,0000,0000,0000,0000,0001,1011
// 结果:0000,0000,0000,0000,0000,0000,0000,1100
// (byte):0000,1100
byte result = (byte)(b1 ^ b2);
System.out.println(result);//12 - 0000,1100
<<左移:
整体向左移动n位,就用n个0补位(补到最低位)
int num = 128;//0000,0000,0000,0000,0000,0000,01000,0000
System.out.println(num << 2);//512 - 0000,0000,0000,0000,0000,0010,0000,0000
>>右移:
整体向右移动n位,就用n个最高位补位(补到最高位)
int a = 128;//0000,0000,0000,0000,0000,0000,01000,0000
System.out.println(a >> 2);//32 - 0000,0000,0000,0000,0000,0000,0010,0000
int b = -128;//1111,1111,1111,1111,1111,1111,1000,0000
System.out.println(b >> 2);//-32 - 1111,1111,111,1111,1111,1111,1110,0000
>>>无符号位右移:
整体向右移动n位,就用n个0补位(补到最高位)
int c = 128;//0000,0000,0000,0000,0000,0000,01000,0000
System.out.println(c >>> 2);//32 - 0000,0000,0000,0000,0000,0000,0010,0000
int d = -128;//1111,1111,1111,1111,1111,1111,1000,0000
System.out.println(d >>> 2);//1073741792 - 0011,1111,111,1111,1111,1111,1110,0000
小结:
&、|、^:前后两侧都是数值,此符号为位运算符
&、|、^:前后两侧都是boolean值,此符号为逻辑运算符
左移1位,相当于乘以2
右移1位,相当于除以2
5.运算符的优先级
经验:不用记,灵活运用小括号
参考表