提到+=,我想大家一定会立刻想到下面的代码:
short a=3;
a=a+1;
a+=3;
问:上面第二行代码和第三行代码在编译时都能通过吗?
老师说:第二行代码在编译时不能通过,第三行代码相当于第二行代码。
这时你晕了吗——既然第三行代码相当于第二行代码,那为什么第二行代码在编译时不能通过呢?
让我来给你讲讲吧:
首先先来看第一行代码“short a=3;”,只要稍有常识的人都知道这行代码并没有错,那是因为“=”为赋值运算符,3为int类型,这行代码之所以没有问题是因为程序在执行的时候会将int类型的数值强转为short类型,分析到这基本上就可以回答这个问题了:“+=”和“=”一样也是赋值运算符,既然是这样那么它具有和“=”一样的特点,所以“ a+=3;”不会在编译时出错。至于“第三行代码相当于第二行代码”,这句话说得有点不太准确,想来应该这样说:单单从最终的结果上来看第三行代码的结果和第二行代码的结果相同。
为什么第二行代码在编译时不能通过:那时因为第二行代码代码的右侧为算术运算,在java可发语言中算术运算有这样一个特点:如果两个数为不同类型的的数,在运算时会将低数据类型的数提升为高数据类型的数。到此就不难回答这个问题了:a为short类型,1为int类型,进行加法运算会先将a提升为int类型,即相当于(int)a+1,这时a+1就变为了int类型,而a变量依然为short类型,所以会出错了。
上面阐述的有点罗嗦,还是用老师的解释吧,呵呵
a=a+1;//编译失败,因为等号右边a会被提升为int类型,运算后的结果还是int类型,无法赋值给short类型。
a+=3;//编译通过,因为+=运算符在给a赋值的同时,也自动完成了强转操作。