先看下面这个代码是否能正常编译运行?如果可以,运行结果是啥?

        int a = 1;

        a += 1.1;
        System.out.println(a);
        
        a *= 1.1;
        System.out.println(a);

        a /= 1.1;
        System.out.println(a);

        a -= 1.1;
        System.out.println(a);

我敢保证没几个人能做对,因为在他们的印象中,a+=1.1实际上就是a=a+1.1,在我学C语言的时候,老师就是这么讲的,我也未曾怀疑。到了学习java的时候,我很确信的认为,没错,就是这样的。直到我看了《Java编程思想》这本书,受益颇深。
好了,回到正题,上面的代码能否正常编译运行呢?答案是可以,很多人可能难以置信,为什么a=a+1.1可以编译通过?这个问题先放放,我们先回答第二个问题,上面代码的运行结果是啥?下面是运行结果截图:
image.png

有没有大吃一惊,颇感意外的感觉?实际上a+=1.1相当于a=(int)(a+1.1),同理,其他的几种写法也都类似。这种写法实际上是把最后结果进行了强制转型。a=a+1.1的等号左边是int类型变量,右边计算结果是double类型,很显然直接赋值给左边会编译报错。但是a+=1.1并不会报错,因为编译器给我们进行了强制转型,这一点在《Java编程思想》一书中有提到。下面我们来看编译之后反编译回来的代码长什么样子?
image.png

看完源码一切都迎刃而解了。

Q.E.D.


擅长前端的Java程序员