Java中的运算符&&三目运算符的结合性和运算性&&数据类型转换及数据溢出现象
Java中的运算符及优先级:
,由上表可以看出,括号和方法调用(表中第一行的 . )的优先级最高,涉及到赋值的运算符优先级最低
巧记:单目算术位(指移位)关系,逻辑三目后赋值,括号方法最先算
结合性:当一个算式的几个运算符优先级相同时,先从哪边开始计算。只要记住单目运算符、三目运算符、赋值运算符是从右向左计算,其他运算符都是从左向右计算就好。
!:后面跟true则得false,后面跟false则得true
~:按二进制位取反,0–>1,1–>0
++和-- 将在另一篇博客Java中间缓存问题中着重展开介绍
/:除法运算,不保留余数,除数不能为零,否则会抛异常ArithmeticException
%:取模,除完后只保留余数,除数不能为零,否则会抛异常ArithmeticException
+:数值运算时为加法,String运算时为字符串拼接
<<:二进制左移,移完低位补零,相当于乘2^n(n为移的位数)
带符号右移>>:二进制右移,带符号,移完最高位补符号(0正1负),相当于除以2^n(n为移的位数)
无符号右移>>>:二进制右移,不带符号,移完最高位补0(无论正负),也就是说最后移位结果一定为正数,正数>>>相当于除以2^n(n为移的位数),负数不是!!!
上述的移位运算符在合适的场合可以代替乘除法,因为其为位运算,cpu处理的是二进制数,所以运行效率高
instanceof:判断其前面的对象是不是其后面类类型的对象,重写equals()方法中有用到。
位运算符:&(与,有假则假) ^(异或,相同为假,相异为真) |(或,有真则真)
逻辑运算符:&& || 和位运算符的区别在于逻辑运算符为短路运算符,运算符前的结果能确定表达式整体的结果,就不会再执行运算符之后的代码;第二个区别是逻辑运算符左右必须是boolean型数据,位运算符左右既可以是boolean,也可以是整型
三目运算符: ?:,A?B:C,若A为true,则执行B,若A为false,则执行C,关于三目运算符的结合性和运算性我在下面也会做总结
赋值运算符
简单赋值运算符:=,把右边的结果赋给左边
复杂赋值运算符:+= *= ~= <<=等,i+=10;相当于i=i+10;复杂赋值运算符是自带强制类型转换的,这个问题我在下面的内容会做总结
三目运算符的结合性和运算性:
public class TestDemo {
public static void main(String[] args) {
int i=21,j=20;
int k=(i>j)?(++i):(i<5)?(++i):(++j);
System.out.println(k);
System.out.println(i);
System.out.println(j);
/**
* 结合性从右向左,意味着将(i>5)?(i=0):(i=5)的结果作为(i<j)?(i+10):A中的A,
* 而不是将(i>j)?(i+10):(i<5)的结果作为B?(i++):(++j)中的B
* 如果运算顺序是从右向左计算,那应该是先计算(i<5)?(i++):(++j),j变成21,
* 再计算(i>j)?(i+10):21,这是21>21不成立,打印k为21,i为21,j为21
* 如果运算顺序是从左向右计算,那应该是先计算(i>j)?(i+10): ,此时21>20,
* 打印k为22,i为22,j为20
*/
}
}
由运算结果可以看出,结合性是从右向左结合的,运算性是从左向右计算的!!!
数据类型转换
数据类型之间是可以转换的,比如int i=10;long l=i;i是int型的,但可以赋值给long型的l
数据类型转换分为:
自动类型转换:代码不需要进行特殊处理,自动完成,将数据范围小的数据类型转换为数据范围大的数据类型(例如byte型表达范围-128~127,short型表达范围-2^15 ~ 2 ^15-1,byte就可以自动转换为short)。
强制类型转换:代码需要进行特殊处理,格式为 范围小的数据类型 变量名=(范围小的数据类型 )(范围大的数据),例如:int i=(int)20L; 可以看出强制类型转换不是自动完成的,而且是将数据范围大的数据类型转换为数据范围小的数据类型(long型数据范围-2^ 63 ~ 2^63-1,int型数据范围-2 ^31~ 2 ^31-1,long型转换为int型为强制类型转换)
强制类型转换可能发生精度损失、数据溢出:
数据溢出:如果 范围小的数据类型 变量名=(范围小的数据类型 )(范围大的数据) 中范围大的数据超过了范围小的数据类型的范围,那么强制类型转换时会发生数据溢出。
精度损失:精度大的数据类型转换为精度小的数据类型会发生精度丢失
复杂赋值运算符自带强制类型转换:
byte、short、char可以和int型运算,运算时先转换为int型,再运算得到int型的结果
boolean型不能发生数据转换!!!