为什么输出结果是-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的结果不同呢??我想知道差异性在哪里
下面是

解决方案 »

  1.   

    运算顺序由右至左,其实就是相当于b = a;
    c = a
    b =  a - a * a = 5 - 5 * 5 = -20
    c = c + b = 5 + 20 = -15等号左边的变量值会被缓存
      

  2.   

     c 和 java 的编译器不同,当然结果也不一样啊。所以这种代码就是潜在的雷,不要在实际中使用
      

  3.   


    感谢你的回答,我想了解java对这行代码是如何分析的呢?
    我比较想明白java和c的编译区别
      

  4.   


    问下哈,你对JVM挺了解的,能帮我看看这个问题是怎么回事吗?
      

  5.   


    问下哈,你对JVM挺了解的,能帮我看看这个问题是怎么回事吗?
    前几天有个问为什么等于-5的,唉。cmd下执行javap -c 全限定类名.class 反编译一下你就懂了。
      

  6.   

    a+=(a-a*a);就是这么一个计算方法嘛干嘛复杂的把自己弄糊涂了
      

  7.   


    问下哈,你对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。
    上面的变量名只是为了方便理解的一个假设,虚拟机存的什么名我也不知道。
      

  8.   

    在Java中,JVM的赋值动作,只是在设别到“=”的时候才进行赋值。所以你在Java中的那种分解方式是不正确的。C语言的,不是很深入。
      

  9.   

    写程序还是不要a+=b-=c什么的写,要分开,因为有时候回头你自己都屡不清了
    顺便一说,后面的a-=a*a其实只是一个值,并没有赋值步骤