完整的代码不详细写了,下面是关键的部分
int m=2,n=1;
m+=m-=n;
syetem.out.println("m="+m);

解决方案 »

  1.   

    m-=n是m=m-n 所以这个时候m=2-1=1
    m+=m是m=m+m    m+m第一个m是上面声明的m  第二个m是m=m-n后的那个m  声明的m初始值是2 第二个m求得1
    所以2+1是最后的结果  也就是3
      

  2.   

    a +=b 可以理解为 a = a + b
    m += m -= n 
    ==》
    m = m + (m = m - n)
    ? = 2 + (? = 2 - 1)
    跟楼上一样,结构就是3
    关键点就是在m-=n之前 m就已经被载入到堆栈里了
      

  3.   

    m+m第一个m是上面声明的m  第二个m是m=m-n后的那个m?
    不理解,执行M-=N之后M的值不是变成1了吗?为什么加的时候是用原来的值
    m = m + (m = m - n) 
    难道是+号左边的M先读取为2,然后在算M-N,把这值付给M,使M变成1?然后在相加?
      

  4.   

    最后输出m=3;如果在java里把两式拆开,或者同样的式子在c++里,则最后m=2.和编译方式有关,java里直接执行,最前面的m在执行时仍然等于2.
      

  5.   

    给你模拟一下编译后的class代码
    m+=m-=n;
    m = m + (m = m -n)
           stack={},m=2,n=1
    Load m stack={2},m=2,n=1        //m + (m=m-n)中最左边的mLoad m stack={2,2},m=2,n=1       //m-n中的m
    Load n stack={2,2,1},m=2,n=1     //m-n中的n
    Sub    stack={2,1},m=2,n=1       //减
    Dup    stack={2,1,1},m=2,n=1     //复制结果
    Store m stack={2,1},m=1,n=1      //存储m (m=m-n)
    Add     stack={3},m=1,n=1        //加
    Store m stack={},m=3,n=1         //存储m m = (m+(m=m-n))class里 所有计算都是在堆栈中完成的。