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

相关推荐
鱼跃鹰飞7 小时前
大厂面试真题-简单说说线程池接到新任务之后的操作流程
java·jvm·面试
王佑辉7 小时前
【jvm】Major GC
jvm
阿维的博客日记7 小时前
jvm学习笔记-轻量级锁内存模型
jvm·cas·轻量级锁
程序员清风9 小时前
浅析Web实时通信技术!
java·后端·面试
测试199810 小时前
外包干了2年,快要废了。。。
自动化测试·软件测试·python·面试·职场和发展·单元测试·压力测试
曹申阳10 小时前
2. JVM的架构模型和生命周期
jvm·架构
mingzhi6111 小时前
渗透测试-快速获取目标中存在的漏洞(小白版)
安全·web安全·面试·职场和发展
嚣张农民11 小时前
一文简单看懂Promise实现原理
前端·javascript·面试
琪露诺大湿12 小时前
JavaEE-多线程初阶(4)
java·开发语言·jvm·java-ee·基础·1024程序员节·原神
Liknana13 小时前
Android 网易游戏面经
android·面试