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

相关推荐
Loveyourself3 小时前
cc压缩机制之-toolResultBudget源码解读
面试
飘尘4 小时前
一文讲清楚前端面试会问到的所有缓存
前端·javascript·面试
windliang5 小时前
Claude Code 源码分析(五):一次 Tool 调用怎样通过权限检查
前端·人工智能·面试
鹿角片ljp9 小时前
Redis 深度复习:从入门到面试通关
数据库·redis·面试
Ming_studying9 小时前
Python + SQLite FTS5 构建本地文档全文搜索器:增量索引、中文检索与高亮
jvm·数据库·python·sqlite
KaifuZeng11 小时前
电源面试问题汇总三
单片机·嵌入式硬件·面试·电路
swipe12 小时前
16|(前端转全栈)前端人排查后端问题:curl、traceId、日志、MySQL、Redis 怎么用?
前端·后端·面试
用户05101225729612 小时前
DAY 5-智能指针与 C++ 内存管理
c++·面试
FogLetter12 小时前
进程VS线程:你的电脑到底是怎么同时干那么多活的?
前端·面试
FogLetter12 小时前
我真的写了个“诈尸式”缓存组件:手撕React KeepAlive
前端·react.js·面试