话不多说,看代码,求解释原因,Java编译器到底如何工作的?
int j = 0;
for (int i = 0; i < 100; i++) {
j = j++;
System.out.println(j);
}
------解决方案--------------------
如果你不理解,你不会看编译后的代码吗?
ILOAD 1
IINC 1 1
ISTORE 1
上面是j=j++;这一句的编译后代码,很明显,首先ILOAD 1载入局部变量j到栈顶,IINC 1 1给局部变量j加上1,ISTORE 1将栈顶存入j,注意这个时候栈顶的值是j最开始的值,也就是没有加1之前的值,所以你这个和j=j等效,或者说是没有实际作用的
------解决方案--------------------
即便你不看编译后的代码,从Java语言层次上分析,j=j++,首先计算右边的值,j++的值是j还没有加1时候的值(相比++j的值是加了1以后的值),取完值以后完成j++的副作用,那就是给j自身加1,再以后讲刚才取到的值赋给j,所以你这个就和j=j一样,即便你中途加了1,但最后赋值又被原来的值覆盖了
------解决方案--------------------
想知道编译器怎么做的,就去看编译后class类的字节码吧!
------解决方案--------------------
永远是0.都被赋予一开始的j=0的值.
------解决方案--------------------
j=j++;
先赋值再自加1,自加1的值没有赋值给j,所以永远是0.
你可以换成j=++j,这样应该是你想要的效果,先自加1,再将自加后的结果赋值给j。