ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

i++和++i的区别

2020-05-14 23:52:13  阅读:379  来源: 互联网

标签:压栈 return 区别 ++ 局部变量 istore 栈帧


栈的概述

栈 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有