一个简单的程序
int n=0;
int i=0
while(n<10)
{
i=i++;
n++;
}
System.out.print(i);
先说结果,i最后的结果是 0
这时对 i++ 这个运算理解不深的人就会觉得,i 每次自增之后赋值给自己,结果不应该是10 吗
在分析结果之前,我们先了解一些jvm的内容
jvm内存分区中有一个叫做栈的区域,这其中由栈帧组成,可以简单理解为每一个栈帧就是一个方法,而栈帧包括局部变量表,操作栈等,我们主要了解这两个就可以,结合下面的图会更直观一些
然后我们了解两个字节码指令
这是java代码编译后的字节码指令,我使用通俗易懂的语言来解释
-第一个指令,我们管他叫做load,它的作用是把一个字面量加载到操作栈中
-第二个指令,我们叫它 inc,它可以把局部变量表的值进行原地自增,一定是局部变量表中的值原地自增
i++的过程就是先load再inc,++i正相反 先inc再load
如果还是不明白下面附上图示过程
i++的过程
同理 ++i的过程类似
了解了以上内容后原因就已经出来了:
重点就在 i=i++; 这句话
执行i++后的栈帧内容是这样的
但是在这之后又做了一个赋值的动作,赋值就是把操作栈中的结果再返回给局部变量表,那么这句话执行结束后 i 的值又变回了0,如果没有其他因素干扰,这样循环多少次,i 仍然是0;
注:本文标题是从字节码分析,但是正文没有涉及字节码内容,因为我在学习这里的时候,我看到字节码是头都大,我相信大部分普通人也是不愿意去看那种东西。所以我只挑选了我认为关键的部分来进行分析,使用一些更加容易理解的词,而不是使用大量的专业术语。如果对这些东西感兴趣可以去系统学习一下jvm以及操作系统。