Java赋值语句举例练习2
1. 基本数据类型题目
(1). 下列两个赋值语句正确么?为什么?
short s =4; //line1
s=s+5; //line2
ANS: 以上语句编译失败!
* line1编译没有问题。原因已经介绍过了,变量初始化的时候,对于整型变量,只要右边的整型常量在左边整型变量表示的范围内就好,两边的数据类型可以不一致。
但是对于浮点型变量的初始化,由于小数点的位置不确定,所以只要把double类型的浮点型常量赋值给float类型的变量,就会编译出错。
*line2会导致编译失败。这个过程不能和变量初始化一样来考虑问题!
原因就是:s+5 其中s是short类型的 5默认是int类型的 所以两者做运算 结果会自动提升到int类型的。int向short类型转换(非初始化过程),是一种高类型向低类型做转换,形式可能损失精度!!所以编译会出错。
(2). 这两个赋值语句正确么?为什么?
short s =4;
s+= 5;
ANS:以上语句编译成功!
(3). Java中s+=5; 和s =s+5;有什么区别?
在Java中,两者的区别就是:
复合赋值运算符:会帮助运算类型右边的被提升运算结果做自动类型转换。保证编译通过
单独赋值运算符:仅仅做结果的数据类型提升,而不会根据两边的类型不一致而做自动类型转换。因此,如果两边类型不一致,并且是高类型向低类型赋值,必然会编译失败。
(4). 总结
遇见这种赋值运算的时候,先分成以下两种情况来考虑:
[1]. 当赋值是变量的初始化的时候:大原则就是实际考虑赋值过程中精度是否损失
*整型变量初始化:只要两边都是整型,并且右边的整型常量大小可以被左边的整型变量存储范围所容纳,这个赋值过程实际上就不会损失精度。编译正确。
e.g. short s=30000; //编译正确
byte b =128;// 编译错误
*浮点变量初始化:由于小数点的位置不确定,所以,只要是右边的double类型的常量赋值给左边的float类型的变量,实际的赋值过程可能会出现精度损失,编译出错。
e.g. float f=54.65;//编译错误。右边默认double类型。
[2]. 当赋值不是变量初始化的时候:分成单独赋值运算和符合赋值运算
*单独赋值运算:右边的计算结果会自动进行类型提升,一旦左边的类型比右边的类型低,这种赋值就会出现编译失败。
e.g.short s =0;
s = s+4; //4为int s为short 两者相加类型提升为int int向short转换 精度损失
//编译失败
*复合赋值运算:再计算结果被自动提升的基础之上,自动帮助进行类型转换,相当于一次手动强制类型转换,保证编译通过,这种赋值会编译成功。
e.g.short s =0;
s+=4; //虽然求和的运算结果是int类型,但是+=帮助做了自动类型转换,所以便以
//正确。相当于 s =(short) s+4;