首页 新闻 会员 周边

Java += 的疑问

0
悬赏园豆:10 [已解决问题] 解决于 2020-03-23 09:39

我们都知道x+=1 <=>x =x+1,但是现在有这么个问题:x += Math.random()10;是没问题的,x =x + Math.random()10;其中x为int类型,后者为什么会报错呢?或者说前者为什么不报错?+=还有什么隐藏特性吗?

DreamCatt的主页 DreamCatt | 菜鸟二级 | 园豆:239
提问于:2020-03-17 21:29
< >
分享
最佳答案
1

这个是Java规范里规定的,+= 复合运算符规定做一次强制转换。当然这有利有弊,要根据实际情况来获取精度啊。
可以看下关于复合运算符的一点解释:
https://www.cnblogs.com/ofyou/p/Compoun-Assignment-Operators.html

收获园豆:4
。淑女范erり | 小虾三级 |园豆:961 | 2020-03-19 17:20

至于 x = x+Math... 这个就如第一个答案所言,类型不匹配且 double > int 无法自动转换所以编译出错。
相反,double = int 则会自动兼容。

。淑女范erり | 园豆:961 (小虾三级) | 2020-03-19 17:22
其他回答(3)
2

非常感谢你提出的问题哈哈,我觉得很有意思,于是我也研究了研究,现在问题解决先一半,x=x+Math.random();报错原因是 这个程序这个执行的顺序:1.先读取右边X的地址。2.右边X与1相加,因为Math.random的结果为double型,所以int与double相加是double型,3.将右值传给左边的x(编译器并不认为左右x的地址相同),而这时左边为int型 而右边为double型,所以报错。如图,

收获园豆:3
小毅同学 | 园豆:177 (初学一级) | 2020-03-17 22:05

感谢

支持(0) 反对(0) DreamCatt | 园豆:239 (菜鸟二级) | 2020-03-18 08:32
1

会进行强转,类型不一样隐藏了一个强制转换

收获园豆:3
邀月入梦 | 园豆:215 (菜鸟二级) | 2020-03-18 18:19
1

很有意思的一个问题,x = x + Math.random();报错的原因估计你也明白了,下面解释一下为什么x+=Math.random();不报错。在源码下,一切无所遁形,+=的操作怎么看源码呢?答案是看jvm指令。
先写个小程序

然后编译得到Main.class文件,再用javap -c反编译

注意看红色圈起来的两条指令,先是int类型转换成double类型(i2d),然后再把double类型转换为int类型(d2i)

我是满意吖 | 园豆:386 (菜鸟二级) | 2020-06-22 17:19
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册