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

相关推荐
归于尽18 分钟前
为什么别人用闭包那么溜?这 8 个场景照着用就对了
前端·javascript·面试
埃泽漫笔34 分钟前
JVM 基础 - JVM 内存结构
jvm
蒟蒻小袁1 小时前
力扣面试150题--全排列
算法·leetcode·面试
典孝赢麻崩乐急2 小时前
Java学习---JVM(1)
java·jvm·学习
海底火旺2 小时前
useState:批处理与函数式更新
前端·react.js·面试
一块plus2 小时前
一门原本只是“试试水”的课程,没想到炸出了一群真诚的开发者
javascript·面试·github
mrsk2 小时前
React useContext 实战指南:打造主题切换功能
前端·react.js·面试
然我2 小时前
闭包在类封装中的神技:实现真正安全的私有属性,面试必懂的封装技巧
前端·javascript·面试
Devil枫2 小时前
Kotlin项目实战与总结
开发语言·jvm·kotlin
timing9942 小时前
SQLite3 中列(变量)的特殊属性
java·jvm·sqlite