为什么输出结果是-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的结果不同呢??我想知道差异性在哪里
下面是
这里按我的理解对第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的结果不同呢??我想知道差异性在哪里
下面是
c = a
b = a - a * a = 5 - 5 * 5 = -20
c = c + b = 5 + 20 = -15等号左边的变量值会被缓存
感谢你的回答,我想了解java对这行代码是如何分析的呢?
我比较想明白java和c的编译区别
问下哈,你对JVM挺了解的,能帮我看看这个问题是怎么回事吗?
问下哈,你对JVM挺了解的,能帮我看看这个问题是怎么回事吗?
前几天有个问为什么等于-5的,唉。cmd下执行javap -c 全限定类名.class 反编译一下你就懂了。
问下哈,你对JVM挺了解的,能帮我看看这个问题是怎么回事吗?谢谢你的信任。
将上面的那个等式分解: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。
上面的变量名只是为了方便理解的一个假设,虚拟机存的什么名我也不知道。
顺便一说,后面的a-=a*a其实只是一个值,并没有赋值步骤