目录
1.赋值操作符
2.算数操作符
3.位移操作符
4.位运算符
5.逻辑运算符/短路运算符
6.条件运算符/三目运算符
7.++运算和--运算
7.使用switch的注意事项
8.while和do-while的区别
1.赋值操作符
【笔试题】下列代码哪个能够通过编译?哪个会报错?
1)short s = 10;s = s + 1;2)short s = 10;s += 1;
第二个能通过编译
1是int类型,而s是short类型,进行加法运算,系统底层会自动给我们提升为int类型,而左边的s是short类型,不能进行赋值
而运算赋值符会在运算的时候,自动兼容数据类型
2.算数操作符
【笔试题】写出下列代码输出的结果:
int a = 10;float f = 12.5f;System.out.println("计算结果为:" + a+f);
计算结果为:1012.5
println()的参数列表中,有三个操作数需要使用“+”运算进行计算
而“+”不管是做字符串的拼接,还是算数运算,都没有优先级之分,都是从左往右依次计算的
3.位移操作符
>> 有符号右移/算数右移
规则:低位丢弃,高位补符号位。
练习:写出下列代码运行的结果:
System.out.println(10 >> 2); System.out.println(-10 >> 2);
10>>2
10的二进制原码:00001010
右移2位:00000010 =2
-10>>2
注:负数进行位操作都是按补码进行的
-10的补码:11110110
右移2位: 11111101
-1取反码:11111100
取反取补码:10000011 =-3
>>> 无符号右移/逻辑右移
规则:低位丢弃,高位直接补零。
练习:写出下列代码运行的结果:
System.out.println(-10 >>> 2);
-10的补码:11111111 11111111 11111111 10001011
右移两位: 00111111 11111111 11111111 11111101 =1073741821
<<左移
规则:高位丢弃,低位补0。
练习:写出下列代码运行的结果:
System.out.println(10 << 2); // 00101000 -> 40 System.out.println(25 << 2); // 01100100 -> 100System.out.println(30 << 4); // 480
4.位运算符
位运算符是基于二进制位进行运算的。
& 与运算
规则:同真则真,有假则假。
练习:写出下列代码运行的结果:
System.out.println(10 & 3); // 2System.out.println(25 & -14); // 16
| 或运算
规则:有真则真,同假才假。
^ 异或运算
规则:相同则为0,不同则为1
~非运算/取反运算
规则:按位取反。
注意,“~“属于单目运算符,只有一个操作数。
练习:写出下列代码运行的结果:
System.out.println(~31); // -32
5.逻辑运算符/短路运算符
逻辑运算符具有短路功能
练习:写出下列代码运行的结果:
int a = 10;
int b = 20;
System.out.println(a > 10 && b + 10 > 10);
System.out.println(b + 10 > a || a >= b);
在使用逻辑运算符时,要注意优先级问题。
练习:结果输出什么内容?
int a = 20;
int b = 10;
boolean result = a >= 20 || a >= b && a + b > 30;
System.out.println(result);
如果按左到右的顺序运算,结果会是false,但是正确结果为true
是因为&&的优先级高于||
6.条件运算符/三目运算符
练习:写出下列代码运行的结果:
int number = -10;
String result = number > 0 ? "正数" : (number < 0 ? "负数" : "为零");
System.out.println(result);
负数
7.++运算和--运算
注:变量++ :代表先使用变量的当前值,用完之后让它自加
++变量:代表先令其自加,再使用自加之后的值
int i = 6;
int j = 10;
if (i++ >= 7 && j-- <= 10) {System.out.println("hello");
}
System.out.println(i);
System.out.println(j);
/** 1、控制台输出的结果是什么?** 2、如果把i++换成++i,则输出结果为?* * 3、在第二问的基础上,把第二个判断条件改为--j>=10,输出结果是什么?
1. 7 10
i++是先赋值的,所以i++=6,6>=7显然不成立,因为逻辑运算符有短路功能,所以后边的j就没有进行自减
所以输出i等于7,j等于10
2.hello 7 9
3.7,9
--j先自减再赋值,--j=9,所以--j>=10显然是错误的,不会输出hello,但i和j都已经参与过自增和自减
所以输出i等于7,j=9
7.使用switch的注意事项
switch并不是适用于所有的数据类型
只支持byte、short、char、int
在JDK1.5版本之后添加了enum枚举类型
JDK1.7之后,添加了String类型
case之后只能声明常量和字面量,不能使用常量
通常情况下,应该在每一个case后件都加break,否则可能执行多个case中的代码
case和default是平级的
switch判断需要两个阶段:1.找case2.找default
不管在哪个阶段,找到起点就会开始向下运行,无论下边是case还是default,要运行到第一个break关键字出现或者全部执行完毕才会结束
什么时候执行default中代码?
任何一个case都不满足,就会开始从default处向下执行,直到遇到break结束
有满足的case,但是没有break,而default又在case后边
8.while和do-while的区别
while是先判断,再执行。
do-while先执行,再判断。
也就意味着,while循环有可能一次都不执行直接跳过(第一次判断循环条件就不满足)。
但是do-while循环最少也会执行一次。
如果do-while和while都能至少执行一次的话,其实没有太大区别。
只有一种情况特殊,就是判断条件直接不符合。
【笔试题】
int i = 0;
int j = 1;
do {i++;j=++i;
} while (i <= 6)
System.out.println(i);
System.out.println(j);
A、0 1
B、5 6
C、编译报错
D、7 8
D