如何理解int i=1;i=i++;

如何理解int i=1;i=i++;

1、引入两个概念:局部变量表操作数栈

栈帧(Stack Frame):

是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区的虚拟机栈(Virtual Machine Stack)的栈元素。栈帧存储了方法的局部变量表,操作数栈,动态连接和方法返回地址等信息。第一个方法从调用开始到执行完成,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。

每一个栈帧都包括了局部变量表,操作数栈,动态连接,方法返回地址和一些额外的附加信息。在编译代码的时候,栈帧中需要多大的局部变量表,多深的操作数栈 都已经完全确定了,并且写入到了方法表的Code属性中,因此一个栈帧需要分配多少内存,不会受到程序运行期变量数据的影响,而仅仅取决于具体虚拟机的实 现

java局部变量表:

是栈帧重要组中部分之一。他主要保存函数的参数以及局部的变量信息。局部变量表中的变量作用域是当前调用的函数。函数调用结束后,随着函数栈帧的销毁。局部变量表也会随之销毁,释放空间。

操作数栈:

与局部变量表一样,均以字长为单位的数组。不过局部变量表用的是索引,操作数栈是弹栈/压栈来访问。操作数栈可理解为java虚拟机栈中的一个用于计算的临时数据存储区。

存储的数据与局部变量表一致含int、long、float、double、reference、returnType,操作数栈中byte、short、char压栈前(bipush)会被转为int。

数据运算的地方,大多数指令都在操作数栈弹栈运算,然后结果压栈。

java虚拟机栈是方法调用和执行的空间,每个方法会封装成一个栈帧压入占中。其中里面的操作数栈用于进行运算,当前线程只有当前执行的方法才会在操作数栈中调用指令(可见java虚拟机栈的指令主要取于操作数栈)。

2、对=赋值运算符的理解

操作数栈弹栈赋值给局部变量表的变量

3、理解int i=1;i=i++;

对于int i=1;  

局部变量表生成标识为i的变量,操作数栈将1压栈,=右边运算已结束,操作数栈将1弹栈,通过=赋值给局部变量表的i变量。

对于i=i++;

i还是局部变量存在的,

i++意思是操作数栈将局部变量表i变量的值压栈,操作数栈栈顶元素是1;之后对局部变量表i变量的值自增变为2;(=右边运算已结束)最后操作数栈将栈顶元素1弹栈,通过=赋值给局部变量表的i变量,此时局部变量表变量i的值为1

综上int i=1;i=i++;此时i=1

补充:

int i=1;i=++i;

对于i=++i;

是先对局部变量表中i变量进行自增,局部变量表中i变量的值为2;操作数栈将局部变量表i变量的值(2)压栈,操作数栈栈顶元素是2;(=右边运算已结束)最后操作数栈将栈顶元素2弹栈,通过=赋值给局部变量表的i变量,此时局部变量表变量i的值为2

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章