当前位置: 首页 > news >正文

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

目录

          • 1. 情况1
            • 1.1 i++
            • 1.2 ++i
          • 2. 情况2
          • 3. 情况3
          • 4. 情况4

1. 情况1
1.1 i++
  • 1.代码块
public void test(){int i = 10;i++;System.out.println(i);}
  • 2.字节码
 0 bipush 102 istore_13 iinc 1 by 16 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 102 istore_13 iinc 1 by 16 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 102 istore_13 iload_14 iinc 1 by 17 istore_18 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 102 istore_13 iload_14 iload_15 iinc 1 by 18 imul9 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 102 istore_13 iload_14 iload_15 iinc 1 by 18 iadd9 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。
http://www.lryc.cn/news/380546.html

相关文章:

  • 使用 devtool 本地调试 nodejs
  • element-plus 表单组件 之element-form
  • redis持久化主从哨兵分片集群
  • IOS Swift 从入门到精通: 结构体的访问控制、静态属性和惰性
  • SQL题:未完成率较高的50%用户近三个月答卷情况
  • 挑战与机遇的交织
  • Java项目:基于SSM框架实现的精品酒销售管理系统分前后台【ssm+B/S架构+源码+数据库+毕业论文】
  • [论文笔记]Are Large Language Models All You Need for Task-Oriented Dialogue?
  • Django 模版过滤器
  • 计算机组成原理 —— 存储系统(DRAM和SRAM,ROM)
  • 第22篇 Intel FPGA Monitor Program的使用<五>
  • 网信办公布第六批深度合成服务算法备案清单,深兰科技大模型入选
  • ES 8.14 向量搜索优化
  • 查看 MAC 的 shell 配置文件
  • 前端下载文件流,axios设置responseType: arraybuffer/blob无效
  • 动手学深度学习(Pytorch版)代码实践 -卷积神经网络-14模型构造
  • Django 模版转义
  • [数据集][目标检测]药片药丸检测数据集VOC+YOLO格式152张1类别
  • Android SurfaceFlinger——HWC图层合成器加载(四)
  • OpenCV--图像金字塔
  • 创意产业如何应对AI的挑战。
  • 设计模式——工厂方法模式
  • apksigner jarsigner.md
  • 在SQL中使用explode函数展开数组的详细指南
  • JavaScript 预编译与执行机制解析
  • 多路h265监控录放开发-(12)完成全部开始录制和全部停止录制代码
  • Redis源码学习:Redis对象和5种数据类型的工作原理
  • 从理论到实践掌握UML
  • LabVIEW Windows与RT系统的比较与选择
  • docker搭建mongo副本集