一、扩展的逻辑运算符(逻辑双与、逻辑双或)
-
逻辑双与&&和逻辑单与&的区别:
①. 共同点:当多个条件,有一个不满足,就不成立!并列关系:有false,则false。
②. 区别:
逻辑单与&:无论符号左边的表达式是true还是false,右边都需要执行!
逻辑双与&&: 具有短路效果!如果符号左边的表达式为false,则右边的表达式不会执行了!
总结:双与&&比单与&的逻辑性更强一些,开发经常使用逻辑双&& ! -
逻辑双或||:
左边的表达式如果为true,右边不执行!
二、位运算符:针对具体的数据值进行运算!
-
分类:
位与&:有0,则0;
位或|:有1,则1;
位异或^:相同则为0,不同则为1;
~反码:对一个数据进行反码,按位取反(全部0变1,1变0)。examples:
3--- 二进制数据 原码--反码--补码 3 00000000 00000000 00000000 00000011 原码--反码--补码 4 00000000 00000000 00000000 00000100 1). 3&4:有0,则0 00000000 00000000 00000000 00000011 位与& 00000000 00000000 00000000 00000100 ------------------------------------------------------ 00000000 00000000 00000000 00000000 结果为0 2). 3|4:有1,则1 00000000 00000000 00000000 00000011 位或| 00000000 00000000 00000000 00000100 ------------------------------------------------------ 00000000 00000000 00000000 00000111 结果为7 3). 3^4:相同则为0,不同则为1 00000000 00000000 00000000 00000011 位异或^ 00000000 00000000 00000000 00000100 ----------------------------------------------- 00000000 00000000 00000000 00000111 结果为7 4). ~3:0变1,1变0 原,反,补相同: 00000000 00000000 00000000 00000011 ~ -------------------------------------------------------- 最高符号位 数值位 1 1111111 11111111 11111111 11111100 (补码) -1 1 1111111 11111111 11111111 11111011 (反码 ) 1 0000000 00000000 00000000 00000100 (原码) 结果为-4
-
位移符号:
1). <<:左移:将数据的补码进行左移动,右边不够的补0,左边多余丢弃掉。
特点:将 <<符号左边的数据乘以2的移动次幂。2). >>:右移 :将数据的补码右移动;如果最高符号位为0,左边补0;如果最高符号位为1,左边补1…
特点:将>>符号左边的数据,除以2的移动次幂。3). >>>:无符号右移:将数据的补码右移动,无论最高符号位为0还是1,左边都补0…
examples:
1). 2<< 2:
将2十进制-----二进制
原码 -- 反码---补码
00000000 00000000 00000000 00000010 << 2
00000000 00000000 00000000 00000010
(00)000000 00000000 00000000 0000001000
---------------------------------------------------------
000000 00000000 00000000 0000001000
补码---反码---原码
结果就是8 //2左移两位 (2 * 2^2) = 8
2). 24 >> 2:
24-----二进制
原码,反码,补码
00000000 00000000 00000000 00011000 >>2
0000000000 00000000 00000000 000110(00)
---------------------------------------------------------
0000000000 00000000 00000000 000110
补码,反码,原码
结果:6 //24右移两位 // 24 /2 ^ 2 = 6
3). -24 >> 2:
原码:
1 0000000 00000000 00000000 00011000
反码:
1 1111111 11111111 11111111 11100111
+ 1
--------------------------------------------------------
补码:
11111111 11111111 11111111 11101000 >>2
1111111111 11111111 11111111 111010(00)
1111111111 11111111 11111111 111010 补码
- 1
---------------------------------------------------------
1111111111 11111111 11111111 111001 反码
1000000000 00000000 00000000 000110 原码
结果:-6 //-24右移两位 // - 24 / 2 ^ 2 = - 6
4). -24>>> 2:
-24的补码:
11111111 11111111 11111111 11101000
0011111111 11111111 11111111 111010(00) 正数:补码---反码---原码
-----------------------------------------------------------
0011111111 11111111 11111111 111010 //1,073,741,818
- 位异或的特点^:一个数据被另一个数据位异或两次:其值是它本身!
examples:
4 ^ 10 ^ 10:
4对应的二进制:原--反--补
00000000 00000000 00000000 00000100
10对应的二进制:原--反码--补
00000000 00000000 00000000 00001010
4 ^ 10 ^ 10:
00000000 00000000 00000000 00000100
00000000 00000000 00000000 00001010
位异或^ ----------------------------------------------
00000000 00000000 00000000 00001110 补码
位异或^ 00000000 00000000 00000000 00001010 10的补码
----------------------------------------------
00000000 00000000 00000000 00000100
结果为:4
三、三元运算符(三目)
-
格式:
(表达式)? 执行成立的结果:执行false的结果; -
执行流程:
1). 首先判断表达式是否成立;
2). 如果成立,执行成立的结果;
3). 如果不成立,就false的结果。 -
三元运算符和if…else的区别
区别:三元运算符—运算符:操作的具体的数据进行对比判断;
能够使用三元操作的,一定能够使用if…else…。
example1:
键盘录入两个数据,判断两个数据是否相等! (true/false:布尔类型) (三元)
//导包
import java.util.Scanner ;
class OperatorDemo{
public static void main(String[] args){
//创建文本扫描器对象
Scanner sc = new Scanner(System.in) ;
//提示并录入数据
System.out.println("请您输入第一个数据:") ;
int a = sc.nextInt() ;
System.out.println("请您输入第二个数据:") ;
int b = sc.nextInt() ;
//(表达式)? 执行成立的结果:执行false的结果;
//boolean flag = (a==b) ? true:false ;
//改造:== :本身就是一个比较运算符:就是true/false
boolean flag = a == b ;
System.out.println(flag) ;
}
}
example2:
键盘录入三个数据,比较数据的最大值:
//导包
import java.util.Scanner ;
class OperatorTest{
public static void main(String[] args){
//创建键盘录入对象
Scanner sc = new Scanner(System.in) ;
//提示并录入
System.out.println("请输入第一个数据:") ;
int a = sc.nextInt() ;
System.out.println("请输入第二个数据:") ;
int b = sc.nextInt() ;
System.out.println("请输入第三个数据:") ;
int c = sc.nextInt() ;
//三元运算:
//方式1
//1)定义一个中间变量temp: 记录a和b的最大值
int temp = (a > b) ? a: b ;
//2)定义max
int max = (temp > c)? temp : c ;
System.out.println("max:"+max) ;
System.out.println("------------------------") ;
//方式2:三元运算符嵌套(不推荐)
int max2 = (a>b) ? ((a>c)? a: c): ((b>c)? b: c) ;
System.out.println("max2:"+max2) ;
}
}
四、流程控制语句
-
流程控制语句:
(1). 顺序结构语句(最基本的语句)
当前xxx.java文件---jvm 编译 -----> 类名.class(字节码文件) 执行程序: java 类名.class; (编译+运行: 底层原理是一种反射:Java高级部分) 后期:反射贯彻于JavaEE jvm调用main方法:代码从上而下依次加载(源顺序)
(2). 选择结构语句:if语句和switch语句
1). if语句
三种格式:第一种格式:
①. 应用场景:针对单个条件进行判断。格式: if(表达式){ 语句; }
②. 执行流程:
首先判断表达式是否成立;
如果成立,则执行语句;
否则不成立,不会执行!③. 注意事项:
a. if的后面不能有; if(表达式);{} 错误语法
有左大括号的地方不能有分号;有分号的地方不能有左大括号;
b. 如果使用if格式1,里面的语句是条语句,{}是可以省略的!不建议省略!第二种格式:
①. 应用场景:针对两种情况进行判断。
②. 执行流程:
首先判断表达式是否成立;
如果成立,执行语句1;
否则,执行语句2。
格式2:
if(表达式){
语句1;
}else{
语句2;
}
第三种格式:
①. 应用场景:针对多个情况进行判断。
②. 执行流程:
首先,判断表达式1是否成立,成立,执行语句1;
否则,判断表达式2是否成立,成立,执行语句2;
否则,判断表达式3是否成立,成立,执行语句3。
格式3:
if(表达式1){
语句1;
}else if(表达式2){
语句2;
}else if(表达式3){
语句3;
...
}else{
语句n+1 ;
}
1). switch语句:
格式:
switch(表达式){
case 值1:
语句1;
break ;
case 值2:
语句2;
break;
...
default:
语句n+1;
break ;
}
①. 执行流程:
首先表达式接收一个值,
然后和case语句值1比较,如果成立,执行语句1,break 结束switch,
值1不匹配,判断和值2是否匹配,如果匹配成功,执行语句2,结束switch,
…
…
上面case 语句都不成立,
执行default语句,执行语句n+1,结束switch!
②. switch语句的注意事项:
a. case语句的后面只能是常量(Java是一个强类型语言),
前端:javascript :switch语句的case后面可以常量也可以变量。
b. break语句:不要轻易省略掉, 会造成case 穿透现象(此时,
如果跟某个case已经匹配,但是没有语句break,下面的case就不会对比,直接执行语句)
break:结束,中断 :结束switch。
c. switch语句的结束条件:a). 语句break结束;b). 程序默认执行的到末尾!
d. default语句可以在switch语句中的任何位置,不影响执行流程!
当前case后面的都匹配,执行default语句;
如果default语句在语句中的话,break语句不能省略!
如果default语句在switch末尾的话,break语句是可以省略!