【面试】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。

相关推荐
每次的天空2 小时前
Android第十三次面试总结基础
android·面试·职场和发展
周末程序猿2 小时前
Linux高性能网络编程十谈|C++11实现22种高并发模型
后端·面试
憨憨睡不醒啊3 小时前
如何让LLM智能体开发助力求职之路——构建属于你的智能体开发知识体系📚📚📚
面试·程序员·llm
尘土哥4 小时前
JVM 垃圾回收器 详解
jvm·垃圾回收器
黄雪超4 小时前
JVM——打开JVM后门的钥匙:反射机制
java·开发语言·jvm
Rocky4014 小时前
JAVAEE->多线程:锁策略
java·开发语言·jvm
前端小崔5 小时前
前端面试题之ES6保姆级教程
开发语言·前端·javascript·面试·职场和发展·ecmascript·es6
安妮的心动录6 小时前
人是习惯的结果
面试·程序员·求职
前端小巷子6 小时前
Promise 静态方法:轻松处理多个异步任务
前端·面试·promise
工呈士6 小时前
Context API 应用与局限性
前端·react.js·面试