我们都知道x+=1 <=>x =x+1,但是现在有这么个问题:x += Math.random()10;是没问题的,x =x + Math.random()10;其中x为int类型,后者为什么会报错呢?或者说前者为什么不报错?+=还有什么隐藏特性吗?
这个是Java规范里规定的,+= 复合运算符规定做一次强制转换。当然这有利有弊,要根据实际情况来获取精度啊。
可以看下关于复合运算符的一点解释:
https://www.cnblogs.com/ofyou/p/Compoun-Assignment-Operators.html
至于 x = x+Math... 这个就如第一个答案所言,类型不匹配且 double > int 无法自动转换所以编译出错。
相反,double = int 则会自动兼容。
非常感谢你提出的问题哈哈,我觉得很有意思,于是我也研究了研究,现在问题解决先一半,x=x+Math.random();报错原因是 这个程序这个执行的顺序:1.先读取右边X的地址。2.右边X与1相加,因为Math.random的结果为double型,所以int与double相加是double型,3.将右值传给左边的x(编译器并不认为左右x的地址相同),而这时左边为int型 而右边为double型,所以报错。如图,
感谢
会进行强转,类型不一样隐藏了一个强制转换
很有意思的一个问题,x = x + Math.random();报错的原因估计你也明白了,下面解释一下为什么x+=Math.random();不报错。在源码下,一切无所遁形,+=的操作怎么看源码呢?答案是看jvm指令。
先写个小程序
然后编译得到Main.class文件,再用javap -c反编译
注意看红色圈起来的两条指令,先是int类型转换成double类型(i2d),然后再把double类型转换为int类型(d2i)