【面试】i++与++i的区别

目录

          • [1. 情况1](#1. 情况1)
            • [1.1 i++](#1.1 i++)
            • [1.2 ++i](#1.2 ++i)
          • [2. 情况2](#2. 情况2)
          • [3. 情况3](#3. 情况3)
          • [4. 情况4](#4. 情况4)
1. 情况1
1.1 i++
  • 1.代码块

    public void test(){
    int i = 10;
    i++;
    System.out.println(i);
    }

  • 2.字节码

    0 bipush 10
    2 istore_1
    3 iinc 1 by 1
    6 getstatic #2 <java/lang/System.out : Ljava/io/PrintStream;>
    9 iload_1
    10 invokevirtual #3 <java/io/PrintStream.println : (I)V>
    13 return

1.2 ++i
  • 1.代码块

    public void test(){
    int i = 10;
    ++i;
    System.out.println(i);
    }

  • 2.字节码

    0 bipush 10
    2 istore_1
    3 iinc 1 by 1
    6 getstatic #2 <java/lang/System.out : Ljava/io/PrintStream;>
    9 iload_1
    10 invokevirtual #3 <java/io/PrintStream.println : (I)V>
    13 return

  • 3.该情况下,i++与++i没有区别,均是在原有的基础自增1,然后输出

2. 情况2
  • 1.代码块

    public void test(){
    int i = 10;
    i = i++;
    System.out.println(i);
    }

  • 2.字节码

    0 bipush 10
    2 istore_1
    3 iload_1
    4 iinc 1 by 1
    7 istore_1
    8 getstatic #2 <java/lang/System.out : Ljava/io/PrintStream;>
    11 iload_1
    12 invokevirtual #3 <java/io/PrintStream.println : (I)V>
    15 return

  • 3.分析

    1.当int取值-128~127 时,JVM采用bipush 指令将常量压入栈中。
    2.bipush 10将10放入操作数栈里。
    3.istore_1 将操作数栈顶10取出来放入局部变量表角标为1的位置。
    4.单元测试方法局部变量表角标为0的位置放的是this。
    5.iload_1 将局部变量表角标为1的数放到操作数栈中。
    6.iinc 1 by 1 给局部变量表索引为1的位置自增长1,
    局部变量表索引为1的位置当前是10,自增后为11。
    7.istore_1 将操作数栈顶元素10放入局部变量表索引为1的位置。
    8.iload_1 将局部变量表角标为1的数拿出来打印即10。

3. 情况3
  • 1.代码块

    public void test(){
    int i = 10;
    i *= i++;
    System.out.println(i);
    }

  • 2.字节码

    0 bipush 10
    2 istore_1
    3 iload_1
    4 iload_1
    5 iinc 1 by 1
    8 imul
    9 istore_1
    10 getstatic #2 <java/lang/System.out : Ljava/io/PrintStream;>
    13 iload_1
    14 invokevirtual #3 <java/io/PrintStream.println : (I)V>
    17 return

  • 3.分析

    1.bipush 将10压入操作数栈。
    2.istore_1 操作数栈顶元素弹出,放入局部变量表索引为1的位置。
    3.iload_1 取局部变量表索引为1的数10,放入操作数栈顶。
    4.iload_1 取局部变量表索引为1的数10,放入操作数栈顶。
    5.iinc 1 by 1 给局部变量表索引为1的数自增1,即11。
    6.imul 从操作数栈中弹出两个int值,将它们相乘,并将结果100推回操作数栈顶。
    7.将操作数栈顶100弹出,放入局部变量表索引为1的位置。
    8.将局部变量表索引为1位置上的数100放入操作数栈顶用于打印,即100。

4. 情况4
  • 1.代码块

    public static void test(){
    int i = 10;
    i = i + (i++) + (++i);
    System.out.println(i);
    }

  • 2.字节码

    复制代码
    0 bipush 10

    2 istore_1
    3 iload_1
    4 iload_1
    5 iinc 1 by 1
    8 iadd
    9 iinc 1 by 1
    12 iload_1
    13 iadd
    14 istore_1
    15 getstatic #5 <java/lang/System.out : Ljava/io/PrintStream;>
    18 iload_1
    19 invokevirtual #6 <java/io/PrintStream.println : (I)V>
    22 return

  • 3.分析

    1.bipush 10 将10压入操作数栈顶。
    2.istore_1 将操作数栈顶元素弹出,存到局部变量表索引为1的位置。
    3.iload_1 将局部变量表索引为1的元素压入操作数栈顶。
    4.iload_1 将局部变量表索引为1的元素压入操作数栈顶。
    5.iinc 1 by 1 将局部变量表索引为1的元素自增加1,即11。
    6.iadd 从操作数栈中弹出两个int值,将它们相加,并将结果20推回操作数栈顶。
    7.iinc 1 by 1 将局部变量表索引为1的元素自增加1,即12。
    8.iload_1 将局部变量表索引为1的元素压入操作数栈顶,即12。
    9.iadd 从操作数栈中弹出两个int值,即12和20,将它们相加,
    并将结果32推回操作数栈顶。
    10.istore_1 将操作数栈顶元素32弹出,存到局部变量表索引为1的位置。
    11.iload_1 将局部变量表索引为1的元素32存到操作数栈打印。即32。

相关推荐
独行soc8 小时前
#渗透测试#批量漏洞挖掘#HSC Mailinspector 任意文件读取漏洞(CVE-2024-34470)
linux·科技·安全·网络安全·面试·渗透测试
小飞悟10 小时前
你以为 React 的事件很简单?错了,它暗藏玄机!
前端·javascript·面试
微风粼粼10 小时前
程序员在线接单
java·jvm·后端·python·eclipse·tomcat·dubbo
掘金安东尼11 小时前
技术解析:高级 Excel 财务报表解析器的架构与实现
前端·javascript·面试
天天扭码11 小时前
AI时代,前端如何处理大模型返回的多模态数据?
前端·人工智能·面试
阳火锅11 小时前
都2025年了,来看看前端如何给刘亦菲加个水印吧!
前端·vue.js·面试
Java技术小馆12 小时前
GitDiagram如何让你的GitHub项目可视化
java·后端·面试
UGOTNOSHOT13 小时前
7.4项目一问题准备
面试
掘金-我是哪吒13 小时前
分布式微服务系统架构第158集:JavaPlus技术文档平台日更-JVM基础知识
jvm·分布式·微服务·架构·系统架构
abigalexy14 小时前
深入JVM底层-内存分配算法
jvm