如果你不理解,你不会看编译后的代码吗?
ILOAD 1
IINC 1 1
ISTORE 1
上面是j=j++;这一句的编译后代码,很明显,首先ILOAD 1载入局部变量j到栈顶,IINC 1 1给局部变量j加上1,ISTORE 1将栈顶存入j,注意这个时候栈顶的值是j最开始的值,也就是没有加1之前的值,所以你这个和j=j等效,或者说是没有实际作用的

解决方案 »

  1.   

    即便你不看编译后的代码,从Java语言层次上分析,j=j++,首先计算右边的值,j++的值是j还没有加1时候的值(相比++j的值是加了1以后的值),取完值以后完成j++的副作用,那就是给j自身加1,再以后讲刚才取到的值赋给j,所以你这个就和j=j一样,即便你中途加了1,但最后赋值又被原来的值覆盖了
      

  2.   

    想知道编译器怎么做的,就去看编译后class类的字节码吧!
      

  3.   

    j=j++;
    先赋值再自加1,自加1的值没有赋值给j,所以永远是0.
    你可以换成j=++j,这样应该是你想要的效果,先自加1,再将自加后的结果赋值给j。