数据类型转换
1.隐式(自动)类型转换: 从数据类型小的到数据类型大的转换,都是数字型的,布尔类型不参与
byte < short < int < long < float < double
char < int < long < float < double
1)多种类型参与运算,小的数据类型会自动转换为大的数据类型
double a=3.14;
int b=3;
double c=a+b;
2)byte,short,char这三种之间不转换(byte < short例外),在运算时会直接转换为int类型
byte x=3;
byte y=4;
int z=x+y;
2.强制类型转换:从数据类型大的到数据类型小的转换
格式:目标数据类型 变量名= (目标数据类型)被转换的数据;
byte x=3;
byte y=4;
byte z=(byte)(x+y); //x和y会自动提升为int类型
常量优化机制
当都是常量进行运算时,先做运算,然后再看运行的结果在不在目标范围之内。
byte z=3+4; //等价于 byte z=7;
算数运算符
算数运算符:+ - * / %
/(除法):两个整数相除,得到的结果还是整数
%(取模):两个整数相除,得到余数
举例:5/2=2; 5%2=1;
可以通过" /(除法) "和" %(取模) "对整数进行拆分,拆成个,十,百,千位
字符的运算
字符和整数之间是有一个对应关系的,多个字符和整数之间的对应关系形成了一个编码表。最早的编码表是ASCII码表(美国信息交换码表)
ASCII编码表中包含大小写字母和一些标点符号,以及一些特殊字符
'a' 97
'A' 65
'0' 48
字符在做运算的时候,其实就是用底层的整数来做运算
char ch='a';
int n=ch+1; //字符在运算时会自动提升为int,97+1=98
System.out.println(n); //98
char m=(char)(ch+1); //(ch+1)的结果为98,把98强制转换为char就是'b'
System.out.println(m); //b
字符串的加操作
+运算符左右两边如果有字符串参与运算,它起到的都是连接的作用。
int a=10;
int b=20;
System.out.println(a+"+"+b+"="+(a+b)); //10+20=30
自增和自减
++(--)放在操作数的前面: 先让操作数自增(自减),然后再做其他运算
int a=3;
int b=++a; //等价于 a++; int b=a;
System.out.println(a); //4
System.out.println(b); //4
++(--)放在操作数的后面: 先让操作数做其他运算,然后自己再自增(自减)
int a=3;
int b=a++; //等价于 int b=a; a++;
System.out.println(a); //4
System.out.println(b); //3
小结:不管++(--)放在操作数的前面还是后面,始终都得自增或者自减。
赋值运算符
=: 把右边的结果赋值给左边
int a=10; //把整数10赋值给左边的变量a
a+=1; //结果为11,与a=a+1类似,但 += 隐藏一个强制类型转换操作
+= -= *= /- %= : 把左右两边的运算结果重新赋值给左边
比较运算符
比较运算符:> >= < <= == !=
==: 比较两个数据是否相等(比较运算符)
=: 把右边的结果赋值给左边(赋值运算符)
比较运算符的结果都是boolean类型,真或者假
逻辑运算符
逻辑运算符:& | ! ^
&(与): 左右两边都是true,结果才为true; 否则为false;
|(或): 左右两边都是false,结果才为false; 否则为true;
!(非): true变false; false变true
^(异或): 左右相同为false; 不相同为true
&&和||的短路效果
&&:左边为false,右边不运算。
||:左边为true,右边不运算。
小结: 在实际工作中,选择&&和||较多
三元运算符
格式:关系表达式? 表达式1:表达式2;
执行流程:
1.判断关系表达式的结果是true还是false
2.如果为true,执行表达式1
3.如果为false,执行表达式2