可能有很多程序员认为i+=1只是i=i+1的简写方式,其实不然,它们一个使用简单赋值运算,一个使用复合赋值运算,而简单赋值运算和复合赋值运算的最大差别就在于:复合赋值运算符会自动地将运算结果转型为其左操作数的类型。看看以下的两种写法,你就知道它们的差别在哪儿了:
(1) byte i=5;
<wbr><wbr><wbr><wbr><wbr> i+=1;</wbr></wbr></wbr></wbr></wbr>
(2) byte i=5;
<wbr><wbr><wbr><wbr><wbr> i=i+1;</wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr> 第一种写法编译没问题,而第二种写法却编译通不过。原因就在于,当使用复合赋值运算符进行操作时,即使右边算出的结果是int类型,系统也会将其值转化为左边的byte类型,而使用简单赋值运算时没有这样的优待,系统会认为将i+1的值赋给i是将int类型赋给byte,所以要求强制转换。理解了这一点后,我们再来看一个例子:</wbr></wbr></wbr>
<wbr> byte b=120;</wbr>
<wbr> b+=20;</wbr>
<wbr> System.out.println("b="+b);</wbr>
<wbr> 说到这里你应该明白了,上例中输出b的值不是140,而是-116。因为120+20的值已经超出了一个byte表示的范围,而当我们使用复合赋值运算时系统会自动作类型的转化,将14</wbr>0强转成byte,所以得到是-116。由此可见,在使用复合赋值运算符时还得小心,因为这种类型转换是在不知不觉中进行的,所以得到的结果就有可能和你的预想不一样。