这是一道常见的经典Java基础面试题,主要考察的是运算时精度问题。
1、a+=b 形式
package com.test;
/**
* @author riemann
* @date 2019/10/09 17:47
*/
public class AccuracyTest {
public static void main(String[] args) {
short a = 1;
a += 2;
System.out.println(a);
}
}
结果输出:
3
大家需要明确的是“+=”是java中的一个运算符,而不是两个,所以在运算时 会进行自动类型转换。所以在编译时没有报错。
2、a=a+b 形式
package com.test;
/**
* @author riemann
* @date 2019/10/09 17:47
*/
public class AccuracyTest {
public static void main(String[] args) {
short a = 1;
a = a + 2;
System.out.println(a);
}
}
IDEA 直接报红,根本无法运行。报红的原因是:类型不匹配,因为相加运算默认的类型是 int 类型,而左边的 a 却是 short 类型,所以把 int 类型的 a + 2 的值赋值给左边 short 类型的 a,毫无疑问类型不匹配报错。
当然,我们可以做强制转换,将已经转换成int类型的a+2强制转换为short类型,这样也是可以的。但是这种转换可能会导致溢出或者精度的下降,如果容忍可能出现的误差,可以使用这种转换。
package com.test;
/**
* @author riemann
* @date 2019/10/09 17:47
*/
public class AccuracyTest {
public static void main(String[] args) {
short a = 1;
a = (short) (a + 2);
System.out.println(a);
}
}
结果输出:
3
那我有个疑问了,这个 short 类型精度比 int 类型低,要是比 int 类型高的呢?比如 long 类型,我们再来看下:
package com.test;
/**
* @author riemann
* @date 2019/10/09 17:47
*/
public class AccuracyTest {
public static void main(String[] args) {
Long a = 1L;
a = a + 2;
System.out.println(a);
}
}
结果输出:
3
这就表明左边类型的精度要比右边类型的精度低,才要强制转换,a+=b和a=a+b 才有区别,否则这两种形式的运算结果是没差别的。
3、小结
这两种形式的主要区别在于是否进行数据类型的自动转换,当两个操作数同类型时这两种形式的运算结果是没有差别的,当两个操作数数据类型不同时,且左操作数即保存结果的操作数的数据精度要低,此时这两种形式才有区别。
转载:https://blog.csdn.net/riemann_/article/details/102467046
查看评论