从零开始的Java笔记(day5——运算符)
说明:本文章的day天数并非博主按照实际操作天数进行创作,而是根据内容多少进行分类。为提高效率,可能存在一天创作多篇文章的可能性,希望阅读者不要过多计较,如果本系列文章对您有所帮助,那将会是我的荣幸!
运算符
算术运算符 :+,-,,/,%,++(自增),–(自减)
赋值运算符 : =
扩展赋值运算符:+=,-=,=,/=
关系运算符:>,<,>=,<=,==,!=
逻辑运算符:&,|, &&,||,!,^
位运算符:&,|,^,~ , >>,<<,>>> (了解!!!)
条件运算符:?:
相关概念辨析
“+” 运算符 操作符 Operator
5+6 表达式 expression
5 6 操作数 Operand
int m =5+6; 语句 Sentence
算术运算符
/和%
/ 除法运算符 : 表示两个数相除运算
% 取余运算符: 用来求余数的
练习:
import java.util.Scanner;
public class TestOpe02{
public static void main(String[] args){
//实现功能:任意给出一个四位数,求出每位上的数字并输出
//1.任意给出一个四位数:
Scanner input = new Scanner(System.in);
System.out.println("请录入一个四位数:");
int num = input.nextInt();
//2.求出每位上的数字:
//个位数:
int num1 = num%10;
//十位数:
int num2 = num/10%10;//1234--->123--->3
//百位数:
int num3 = num/100%10;//1234--->12--->2
//千位数:
int num4 = num/1000;//1234--->1
//3.输出每位上的数字:
System.out.println("个位上的数为:"+num1);
System.out.println("十位上的数为:"+num2);
System.out.println("百位上的数为:"+num3);
System.out.println("千位上的数为:"+num4);
}
}
+的作用
- 表示正数
- 表示相加操作
- 进行字符串的拼接
练习:
public class TestOpe03{
public static void main(String[] args){
//表示正数:
System.out.println(+5);//5
//相加操作:
System.out.println(5+6);//11
System.out.println(5+'6');//59;原因:'6'代表ASCII码中的数字6,底层字符为54,因此二者做加法运算后结果为59
//字符串的拼接:
//规则:+左右两侧的任意一侧有字符串,那么这个加号就是字符串拼接的作用,结果一定是字符串
int num = 56;
System.out.println("num="+num);//"num=56" --->显示结果 num=56
System.out.println(5+6+"7");//11+"7"--->"117" --->117
System.out.println(5+'6'+"7");//59 +"7"--->"597" --->597
System.out.println("5"+6+"7");//"56"+"7" --->"567"--->567
System.out.println("5"+'6'+"7");//"56"+"7"--->"567"--->567
System.out.println("5"+'6'+'7');//"56"+'7'--->"567"---567
}
}
++的运用
无论这个变量是否参与到运算中去,只要用++运算符,这个变量本身就加1操作
只是说如果变量参与到运算中去的话,对运算结果是产生影响:
看++在前还是在后,如果++在后:先运算,后加1 如果++在前,先加1,后运算
练习1:
public class TestOpe04{
public static void main(String[] args){
int a = 5;
a++;//理解为:相当于 a=a+1 操作
System.out.println(a);//6
a = 5;
++a;//理解为:相当于 a=a+1 操作
System.out.println(a); //6
//总结:++单独使用的时候,无论放在前还是后,都是加1操作
//将++参与到运算中:
//规则:看++在前还是在后,如果++在后:先运算,后加1 如果++在前,先加1,后运算
a = 5;
int m = a++ + 7;//先运算 m=a+7 再加1: a = a+1
System.out.println(m);//12
System.out.println(a);//6
a = 5;
int n = ++a + 7;//先加1 a=a+1 再运算: n = a+7
System.out.println(n);//13
System.out.println(a);//6
}
}
练习2:
public class TestOpe05{
public static void main(String[] args){
int a = 5;
System.out.println(a++ + a++);//结果:11;a=5与a自增后的6相加所得,a=6在完成加法运算再自增得到a=7,即a=7
System.out.println(a++ + ++a);//结果:16;上一行的a=7与前后自增两次后的a=9相加所得,即a=9
System.out.println(++a + a++);//结果:20;上一行的a=9先自增到a=10与后面的10相加所得,相加完成后a自增至11,即a=11
System.out.println(++a + ++a);//结果:25;上一行的a=11先自增到12与后面先自增的13相加所得,即a=13
}
}
赋值运算符"="
=的作用: 将等号右侧的值赋给等号左侧。
面试题:两种变量的交换
https://www.cnblogs.com/Brad-Lee/p/5808299.html
扩展赋值运算符
a+=b 和 a=a+b 区别:
(1)a+=b 可读性稍差 编译效率高 底层自动进行类型转换
(2)a=a+b 可读性好 编译效率低 手动进行类型转换
面试题
请问a+=b相当于a=a+b,那么也相当于 a=b+a吗?
答案:对于基本数据类型而言,本身并无区别;但对于String类型将会有先后顺序的区分,如图所示:
关系运算符
关系运算符最终结果:要么是true要么是false
关系运算符
>,<,>=,<=,==,!=
public class TestOpe08{
public static void main(String[] args){
//>,<,>=,<=,==,!=
//关系运算符最终结果:要么是true要么是false
System.out.println(4>9);//false
System.out.println(4<9);//true
System.out.println(4>=9);//false
System.out.println(4<=9);//true
System.out.println(4==9);//false
System.out.println(4!=9);//true
System.out.println((5<9)!=(6==8));//true
}
}
逻辑运算符
逻辑运算符:进行逻辑运算的,运算符左右连接的都是 布尔类型的操作数,最终表达式的结果是布尔值:要么是true,要么false
逻辑运算符:&,|, &&,||,!,^
public class TestOpe09{
public static void main(String[] args){
// 逻辑与 :& 规律:只要有一个操作数是false,那么结果一定是false
System.out.println(true&true);
System.out.println(true&false);
System.out.println(false&false);
System.out.println(false&true);
// 短路与:&& 规律:效率高一些,只要第一个表达式是false,那么第二个表达式就不用计算了,结果一定是false
System.out.println(true&&true);
System.out.println(true&&false);
System.out.println(false&&false);
System.out.println(false&&true);
// 逻辑或:| 规律:只要有一个操作数是true,那么结果一定是true
System.out.println(true|true);
System.out.println(true|false);
System.out.println(false|false);
System.out.println(false|true);
// 短路或:|| 规律:效率高一些,只要第一个表达式是true,那么第二个表达式就不用计算了,结果一定是true
System.out.println(true||true);
System.out.println(true||false);
System.out.println(false||false);
System.out.println(false||true);
//逻辑非: ! 规律:相反结果
System.out.println(!true);//false
System.out.println(!false);//true
//逻辑异或: ^ 规律:两个操作数相同,结果为false,不相同,结果为true
System.out.println(true^true);
System.out.println(true^false);
System.out.println(false^false);
System.out.println(false^true);
}
}
加强练习:
public class TestOpe10{
public static void main(String[] args){
int i=8;
System.out.println((5>7)&&(i++==2)); //false
System.out.println(i); //i=8是因为上述短路与的操作使&&后半部分的代码未进行编译,所以不存在i的自增操作
int a=8;
System.out.println((5>7)&(a++==2)); //false
System.out.println(a); //i=9,进行了自增操作
int m=8;
System.out.println((5<7)&&(m++==2)); //false
System.out.println(m); //短路与前半部分为true,需继续后面部分操作,实现了i的自增,即i=9
int b=2;
System.out.println((5<7)&(b++==2)); //true
System.out.println(b); //3
int c=2;
System.out.println((5<7)&(++c==2)); //false
System.out.println(c); //3
}
}
条件运算符
条件运算符:又称: 三元运算符/三目运算符
格式: a?b:c
其中a是一个布尔类型的表达式,返回结果要么是true要么false,通过a的结果决定最终表达式的结果:
如果a的结果是true,那么表达式最终结果为b
如果a的结果是false,那么表达式最终结果为c
PS:三目运算符可以代替后续的if-else语句
练习:
import java.util.*;//*代表所有
public class TestOpe12{
public static void main(String[] args){
//实现功能:男孩女孩选择晚饭吃什么,如果意见一致,听男生的,如果意见不一致,听女生的
//1.要让男孩女孩选择晚饭吃什么:
Scanner sc = new Scanner(System.in);
System.out.println("请选择今晚吃什么:1.火锅 2.烧烤 3.麻辣烫 4.西餐");
System.out.println("请男孩选择:");
int boyChoice = sc.nextInt();
System.out.println("请女孩选择:");
int girlChoice = sc.nextInt();
//2.判断:
System.out.println(boyChoice==girlChoice?"听男孩的":"听女孩的");
}
}
位运算符
位运算符:&,|,^,~ , >>,<<,>>>
如何区分逻辑运算符和位运算符:
逻辑运算符:左右连接的是布尔类型的操作数
位运算符:左右连接的是具体的数值
-
<< 左移操作
例如: 3<<2 = 12
面试题: 4乘以8最快的方式: 4<<3 -
>> 有符号的右移操作
例如: -6>>2 = -2
-
>>> 无符号的右移操作:
例如: 6>>2 = 1
-
& 与运算
例如: 6&3 = 2
-
| 或运算
例如: 6|3=7
-
^异或:
例如: 6^3 = 5
-
~反:
例如: ~6 = -7
面试题:byte类型的表数范围的 -128是怎么算出来的 ?
127: 01111111
-128: 10000000
一看就是个负数
减1: 01111111
取反: 10000000 —》2^7 = 128
加负号: -128
运算符总结
运算符优先级
赋值<三目<逻辑<关系<算术<单目
练习:
5<6 | ‘A’>‘a’ && 126<=45+23&&!true
=5<6 | ‘A’>‘a’ && 126<=45+23&&false
= 5<6 | ‘A’>‘a’ &&72<=68&&false
= true|false&&false&&false
= true&&false&&false
=false&&false
=false