Java-运算符
第三章 Java运算符
【1】Java 语言支持如下运算符:
- 算术运算符
+,-,*,/,%,++(自增),--(自减)
- 赋值运算符
=
- 扩展赋值运算符
+=,-=,*=,/=
- 关系运算符
>,<,>=,<=,==,!=
- 逻辑运算符
&,|, &&,||,!,^
- 位运算符
&,|,^,~ , >>,<<,>>> (了解!!!)
- 条件运算符
?:
【2】相关概念辨析
+ 运算符 操作符 Operator
5+6 表达式 expression
5 6 操作数 Operand
int m =5+6; 语句 Sentence
算术运算符
/和%
【1】/ 除法运算符 : 表示两个数相除运算
% 取余运算符: 用来求余数的
1. public class TestOpe01{ 2. public static void main(String[] args){ 3. //打印结果: 4. System.out.println(12/3); 5. System.out.println(12%5); 6. System.out.println(12/3.0); 7. System.out.println(12%5.0); 8. } 9. }
【2】练习:
1. import java.util.Scanner; 2. public class TestOpe02{ 3. public static void main(String[] args){ 4. //实现功能:任意给出一个四位数,求出每位上的数字并输出 5. 6. //1.任意给出一个四位数: 7. Scanner input = new Scanner(System.in); 8. System.out.println("请录入一个四位数:"); 9. int num = input.nextInt(); 10. 11. 12. //2.求出每位上的数字: 13. //个位数: 14. int num1 = num%10; 15. //十位数: 16. int num2 = num/10%10;//1234--->123--->3 17. //百位数: 18. int num3 = num/100%10;//1234--->12--->2 19. //千位数: 20. int num4 = num/1000;//1234--->1 21. 22. 23. //3.输出每位上的数字: 24. System.out.println("个位上的数为:"+num1); 25. System.out.println("十位上的数为:"+num2); 26. System.out.println("百位上的数为:"+num3); 27. System.out.println("千位上的数为:"+num4); 28. } 29. 30.}
+
【1】+的作用:
(1)表示正数
(2)表示相加操作
(3)进行字符串的拼接
【2】代码练习:
1. public class TestOpe03{ 2. public static void main(String[] args){ 3. //表示正数: 4. System.out.println(+5);//5 5. //相加操作: 6. System.out.println(5+6);//11 7. System.out.println(5+'6');//59 8. //字符串的拼接: 9. //规则:+左右两侧的任意一侧有字符串,那么这个加号就是字符串拼接的作用,结果一定是字符串 10. int num = 56; 11. System.out.println("num="+num);//"num=56" ---> num=56 12. System.out.println(5+6+"7");//11+"7"--->"117" --->117 13. System.out.println(5+'6'+"7");//59 +"7"--->"597" --->597 14. System.out.println("5"+6+"7");//"56"+"7" --->"567"--->567 15. System.out.println("5"+'6'+"7");//"56"+"7"--->"567"--->567 16. System.out.println("5"+'6'+'7');//"56"+'7'--->"567"---567 17. } 18.}
++
【1】++:
1. public class TestOpe04{ 2. public static void main(String[] args){ 3. int a = 5; 4. a++;//理解为:相当于 a=a+1 操作 5. System.out.println(a);//6 6. 7. a = 5; 8. ++a;//理解为:相当于 a=a+1 操作 9. System.out.println(a); //6 10. 11. //总结:++单独使用的时候,无论放在前还是后,都是加1操作 12. 13. //将++参与到运算中: 14. //规则:看++在前还是在后,如果++在后:先运算,后加1 如果++在前,先加1,后运算 15. a = 5; 16. int m = a++ + 7;//先运算 m=a+7 再加1: a = a+1 17. System.out.println(m);//12 18. System.out.println(a);//6 19. 20. a = 5; 21. int n = ++a + 7;//先加1 a=a+1 再运算: n = a+7 22. System.out.println(n);//13 23. System.out.println(a);//6 24. } 25.}
无论这个变量是否参与到运算中去,只要用++运算符,这个变量本身就加1操作
只是说如果变量参与到运算中去的话,对运算结果是产生影响:
看++在前还是在后,如果++在后:先运算,后加1 如果++在前,先加1,后运算
【2】练习:
1. public class TestOpe05{ 2. public static void main(String[] args){ 3. int a = 5; 4. System.out.println(a++ + a++); 5. System.out.println(a++ + ++a); 6. System.out.println(++a + a++); 7. System.out.println(++a + ++a); 8. } 9. }
运算过程:
赋值运算符
【1】=的作用: 将等号右侧的值赋给等号左侧:
int age = 19;
int age = 10+3+8;
【2】练习:
1. public class TestOpe06{ 2. public static void main(String[] args){ 3. //任意给出两个数,交换两个数并输出: 4. //1.给出两个数: 5. int num1 = 10; 6. int num2 = 20; 7. 8. //2.输出交换前的两个数: 9. System.out.println("交换前:"+num1+"\t"+num2); 10. 11. //3.交换 12. /* 13. 错误代码: 14. num1 = num2; 15. num2 = num1; 16. */ 17. //解决办法: 18. //引入一个中间变量: 19. int t; 20. t = num1; 21. num1 = num2; 22. num2 = t; 23. /* 24. int t; 25. t = num2; 26. num2 = num1; 27. num1 = t; 28. 29. */ 30. 31. //4.输出交换后的两个数: 32. System.out.println("交换后:"+num1+"\t"+num2); 33. } 34.} 35.
面试题:两个数交换的四种方式:https://www.cnblogs.com/Brad-Lee/p/5808299.html
扩展赋值运算符
【1】代码:
1. public class TestOpe07{ 2. public static void main(String[] args){ 3. //实现功能:给出三个数,求和: 4. //1.给出三个数: 5. int num1 = 10; 6. int num2 = 20; 7. int num3 = 30; 8. //2.求和 9. //int sum = num1+num2+num3; 10. //定义一个变量,用来接收和: 11. int sum = 0; 12. sum = sum + num1;//等效: sum += num1; 13. sum = sum + num2;// sum += num2; 14. sum = sum + num3;//sum += num3; 15. //3.将和输出: 16. System.out.println("和:"+sum); 17. } 18.}
内存:
【2】a+=b 和 a=a+b 区别:
(1)a+=b 可读性稍差 编译效率高 底层自动进行类型转换
(2)a=a+b 可读性好 编译效率低 手动进行类型转换
【3】面试题
(1)请问a+=b相当于a=a+b,那么也相当于 a=b+a吗?
(2)下面的代码哪一句出错: 4
byte a = 10; --->1
int b = 20; --->2
a+=b; ---->3
a = a+b ;---->4
更正: a = (byte)(a+b);
关系运算符
1. public class TestOpe08{ 2. public static void main(String[] args){ 3. //>,<,>=,<=,==,!= 4. //关系运算符最终结果:要么是true要么是false 5. System.out.println(4>9);//false 6. System.out.println(4<9);//true 7. System.out.println(4>=9);//false 8. System.out.println(4<=9);//true 9. System.out.println(4==9);//false 10. System.out.println(4!=9);//true 11. System.out.println((5<9)!=(6==8));//true 12. } 13.}
逻辑运算符
&,|, &&,||,!,^
逻辑运算符:进行逻辑运算的,运算符左右连接的都是 布尔类型的操作数,最终表达式的结果是布尔值:要么是true,要么false
代码:
1. public class TestOpe09{ 2. public static void main(String[] args){ 3. // 逻辑与 :& 规律:只要有一个操作数是false,那么结果一定是false 4. System.out.println(true&true); 5. System.out.println(true&false); 6. System.out.println(false&false); 7. System.out.println(false&true); 8. 9. // 短路与:&& 规律:效率高一些,只要第一个表达式是false,那么第二个表达式就不用计算了,结果一定是false 10. System.out.println(true&&true); 11. System.out.println(true&&false); 12. System.out.println(false&&false); 13. System.out.println(false&&true); 14. 15. // 逻辑或:| 规律:只要有一个操作数是true,那么结果一定是true 16. System.out.println(true|true); 17. System.out.println(true|false); 18. System.out.println(false|false); 19. System.out.println(false|true); 20. 21. // 短路或:|| 规律:效率高一些,只要第一个表达式是true,那么第二个表达式就不用计算了,结果一定是true 22. System.out.println(true||true); 23. System.out.println(true||false); 24. System.out.println(false||false); 25. System.out.println(false||true); 26. 27. //逻辑非: ! 规律:相反结果 28. System.out.println(!true);//false 29. System.out.println(!false);//true 30. 31. //逻辑异或: ^ 规律:两个操作数相同,结果为false,不相同,结果为true 32. System.out.println(true^true); 33. System.out.println(true^false); 34. System.out.println(false^false); 35. System.out.println(false^true); 36. } 37.}
再做一个加深的练习:看代码 说结果:
1. public class TestOpe10{ 2. public static void main(String[] args){ 3. int i=8; 4. System.out.println((5>7)&&(i++==2)); //false 5. System.out.println(i); //8 6. 7. 8. int a=8; 9. System.out.println((5>7)&(a++==2)); //false 10. System.out.println(a); //9 11. 12. 13. int m=8; 14. System.out.println((5<7)&&(m++==2)); //false 15. System.out.println(m); //9 16. 17. int b=2; 18. System.out.println((5<7)&(b++==2)); //true 19. System.out.println(b); //3 20. 21. int c=2; 22. System.out.println((5<7)&(++c==2)); //false 23. System.out.println(c); //3 24. } 25.}
条件运算符
【1】条件运算符:又称: 三元运算符/三目运算符
【2】格式:
a?b:c
其中a是一个布尔类型的表达式,返回结果要么是true要么false,通过a的结果决定最终表达式的结果:
如果a的结果是true,那么表达式最终结果为b
如果a的结果是false,那么表达式最终结果为c
代码:
1. public class TestOpe11{ 2. public static void main(String[] args){ 3. int num = (5>7)?6:9 ; 4. System.out.println(num); 5. 6. String str = (4==4)?"你好":"你不好" ; 7. System.out.println(str); 8. 9. System.out.println((4==4)?"你好":"你不好"); 10. } 11.}
练习:
1. import java.util.*;//*代表所有 2. public class TestOpe12{ 3. public static void main(String[] args){ 4. //实现功能:男孩女孩选择晚饭吃什么,如果意见一致,听男生的,如果意见不一致,听女生的 5. 6. //1.要让男孩女孩选择晚饭吃什么: 7. Scanner sc = new Scanner(System.in); 8. System.out.println("请选择今晚吃什么:1.火锅 2.烧烤 3.麻辣烫 4.西餐"); 9. System.out.println("请男孩选择:"); 10. int boyChoice = sc.nextInt(); 11. System.out.println("请女孩选择:"); 12. int girlChoice = sc.nextInt(); 13. //2.判断: 14. System.out.println(boyChoice==girlChoice?"听男孩的":"听女孩的"); 15. } 16.}
PS:三目运算符可以代替后续我们要学习的if-else
位运算符(了解)
位运算符:&,|,^,~ , >>,<<,>>>
如何区分逻辑运算符和位运算符:
逻辑运算符:左右连接的是布尔类型的操作数
位运算符:左右连接的是具体的数值
【1】<< 左移
3<<2 = 12
面试题: 4乘以8最快的方式: 4<<3
【2】>> 有符号右移
6>>2 = 1
-6>>2 = -2
【3】>>> 无符号右移:
6>>>2 = 1
【4】 & 与
6&3 = 2
【5】| 或
6|3=7
【6】^异或:
6^3 = 5
【7】~反:
~6 = -7
PS:
byte类型的表数范围的 -128是怎么算出来的
127: 01111111
-128: 10000000
一看就是个负数
减1: 01111111
取反: 10000000 ---》2^7 = 128
加负号: -128
运算符总结
运算符的优先级别
不需要去刻意的记优先级关系
赋值<三目<逻辑<关系<算术<单目
理解运算符的结合性
PS:实际开发中我们不会写特别复杂的表达式,你要想先算谁就用()
案例:
5<6 | 'A'>'a' && 12*6<=45+23&&!true
=5<6 | 'A'>'a' && 12*6<=45+23&&false
= 5<6 | 'A'>'a' &&72<=68&&false
= true|false&&false&&false
= true&&false&&false
=false&&false
=false