小言_互联网的博客

Java中a+=b和a=a+b有什么区别

471人阅读  评论(0)

这是一道常见的经典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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场