i++和++i的区别
作者:互联网
栈的概述
栈 Stack
Each Java Virtual Machine thread has a private Java Virtual Mahine stack, created at the same time as the thread.
A Java Virtual Machine stack stores frames
栈里面装的是栈帧
栈帧Frame——每个方法对应一个栈帧:
A Frame used to store data and partial results , as well as to perform dynamic linking, return values for methods, and dispatch exceptions.
1. Local Variable Table 局部变量表:当前栈帧用到的同步变量,栈帧一弹出就没了
2. Operand Stack 操作数栈
3. Dynamic Linking 动态链接:a()方法里调用了b()方法,a()代码里调用了B() b方法需要去常量池里找(这个link就叫 Dynamic Linking)
https://blog.csdn.net/qq_41813060/article/details/88379473
4. return address a()调用了b() b方法的返回值放在了什么地方
分析i++和++i
下面一断代码 打印的结果是8
public static void main(String[] args) { int i = 8; i = i++; System.out.println(i); }
虚拟机栈的运行和指令脱不开:下面贴出指令集
0 bipush 8 //把8扔到栈里面去 压栈 2 istore_1 //把8弹出来放到i里面(i在局部变量为1的位置) 这个时候 复制操作i=8; 完成 3 iload_1 //把局部变量表为1位置上的数拿出来 压栈 4 iinc 1 by 1 //把局部变量表为1的位置上的数加1。(i++在局部变量表中完成) 7 istore_1 // 把8弹出来 局部变量表的值从9变成8 8 getstatic #2 <java/lang/System.out> 11 iload_1 12 invokevirtual #3 <java/io/PrintStream.println> 15 return
最后打印结果 8
如果把i=i++ 改成i=++i;在分析一断指令 打印结果是9
0 bipush 8 //压栈 2 istore_1 //把8弹到局部变量表 3 iinc 1 by 1 //局部变量表1的位置加1 完成i++操作 6 iload_1 //把局部变量表为1的位置拿出来 压栈 栈里面是9 7 istore_1 //再把9弹出来 赋值给i i是9 8 getstatic #2 <java/lang/System.out> 11 iload_1 12 invokevirtual #3 <java/io/PrintStream.println> 15 return
注意 第三步和第四步:
i++是先压栈在局部变量表加1,然后栈里的数据弹出
++i是 局部变量表加1 在压栈,然后栈里的数据弹出
标签:压栈,return,区别,++,局部变量,istore,栈帧 来源: https://www.cnblogs.com/ssskkk/p/12861321.html