int a=5; a+=a-=a*a; 最后a的值为什么是-15

ImAmelie 2017-06-24 07:44:03


为什么输出结果是

-15


这里按我的理解对第2行进行拆分和推导

a += a -= 25;
a += (a -= 25);
a += (a = a - 25);
a += (a = 5 - 25);
a += (a = -20);
//a的值变成-20
a += -20;
a = a -20
a = -20 - 20;
a = -40

我的结论是-40 请问哪里有问题呢?
下面是Java的拆分及输出,结果是-40



为什么相同的逻辑代码,C和Java的结果不同呢??我想知道差异性在哪里




下面是
...全文
4252 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
littletiger2014 2017-08-03
  • 打赏
  • 举报
回复
右结合计算,代码不易这样表达,有点教学性质
丶2p 2017-08-03
  • 打赏
  • 举报
回复
写程序还是不要a+=b-=c什么的写,要分开,因为有时候回头你自己都屡不清了 顺便一说,后面的a-=a*a其实只是一个值,并没有赋值步骤
Bonsour 2017-08-03
  • 打赏
  • 举报
回复
在Java中,JVM的赋值动作,只是在设别到“=”的时候才进行赋值。所以你在Java中的那种分解方式是不正确的。C语言的,不是很深入。
Bonsour 2017-08-03
  • 打赏
  • 举报
回复
引用 7 楼 u013491662 的回复:
[quote=引用 7 楼 sunshine_lzy 的回复:]
问下哈,你对JVM挺了解的,能帮我看看这个问题是怎么回事吗?[/quote] 谢谢你的信任。 将上面的那个等式分解:a+=a-=a*a 等价于:a = a + (a - (a*a)) 上面这个转换可以理解吧? 然后程序的计算:先计算a*a = 25,并将这个值保存在栈中,它的计算结果没有赋值给a,它只是在栈中保存了一个临时变量。假设它的变量名为b。 然后接着计算:a- 25 = -20,这个时候又会生成一个计算结果,保存的变量名假设为c。 最后计算a+(-20)=-15。这时候的计算结果,保存为变量d。 最后一步是a=-15,这会儿才将整个计算的结果赋值给a。 所以最后a的值为-15。 上面的变量名只是为了方便理解的一个假设,虚拟机存的什么名我也不知道。
NewshiJ 2017-08-03
  • 打赏
  • 举报
回复
不是应该先计算a*a吗
qq_39694302 2017-08-02
  • 打赏
  • 举报
回复
a+=(a-a*a);就是这么一个计算方法嘛干嘛复杂的把自己弄糊涂了
wautsns 2017-08-02
  • 打赏
  • 举报
回复
引用 7 楼 u013491662 的回复:
[quote=引用 7 楼 sunshine_lzy 的回复:]
问下哈,你对JVM挺了解的,能帮我看看这个问题是怎么回事吗?[/quote] 。。。前几天有个问为什么等于-5的,唉。cmd下执行javap -c 全限定类名.class 反编译一下你就懂了。
ImAmelie 2017-08-02
  • 打赏
  • 举报
回复
引用 7 楼 sunshine_lzy 的回复:
问下哈,你对JVM挺了解的,能帮我看看这个问题是怎么回事吗?
C_onfig 2017-06-27
  • 打赏
  • 举报
回复
学习了
ImAmelie 2017-06-27
  • 打赏
  • 举报
回复
引用 4 楼 desen778 的回复:
要解答这题,得去研究虚拟机的编译规则,这道题看似很简单的题目,其实全是坑
对呀,实际用的时候肯定不这么写,但是学习的时候要深入了解吗
desen778 2017-06-26
  • 打赏
  • 举报
回复
要解答这题,得去研究虚拟机的编译规则,这道题看似很简单的题目,其实全是坑
ImAmelie 2017-06-25
  • 打赏
  • 举报
回复
引用 1 楼 soton_dolphin 的回复:
运算顺序由右至左, 其实就是相当于 b = a; c = a b = a - a * a = 5 - 5 * 5 = -20 c = c + b = 5 + 20 = -15 等号左边的变量值会被缓存
感谢你的回答,我想了解java对这行代码是如何分析的呢? 我比较想明白java和c的编译区别
soton_dolphin 2017-06-24
  • 打赏
  • 举报
回复
c 和 java 的编译器不同,当然结果也不一样啊。所以这种代码就是潜在的雷,不要在实际中使用
soton_dolphin 2017-06-24
  • 打赏
  • 举报
回复
运算顺序由右至左, 其实就是相当于 b = a; c = a b = a - a * a = 5 - 5 * 5 = -20 c = c + b = 5 + 20 = -15 等号左边的变量值会被缓存

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧