当前位置: 首页 > 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。

相关文章:

  • SpringBoot配置第三方专业缓存技术jetcache远程缓存方案和本地缓存方案
  • 前端开发之计算机网络模型认识
  • C#基于SkiaSharp实现印章管理(1)
  • oracle12c dataguard搭建及切换
  • React组件卸载的几种情况
  • Nikto一键扫描Web服务器(KALI工具系列三十)
  • 【break】大头哥哥做题
  • vue登陆密码加密,java后端解密
  • Jenkins+K8s实现持续集成(二)
  • [数据集][目标检测]药片药丸检测数据集VOC+YOLO格式152张1类别
  • 理解堆排序
  • Golang中的CAS操作
  • 算法训练营第六十七天 | 卡码网110 字符串接龙、卡码网105 有向图的完全可达性、卡码网106 岛屿的周长
  • 【操作系统】第五章 文件系统
  • odoo的采购询价单,默认情况下显示‘draft‘,‘sent‘,‘purchase‘,请问什么情况下才会显示‘to approve‘?
  • conda常用的命令
  • CSS实用技巧干货
  • C语言笔记(第一章:C语言编程)
  • ECS应用管理最佳实践
  • HashMap剖析之内部结构
  • Java比较器对数组,集合排序
  • React组件设计模式(一)
  • 编写高质量JavaScript代码之并发
  • 模型微调
  • 那些被忽略的 JavaScript 数组方法细节
  • 扑朔迷离的属性和特性【彻底弄清】
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 首页查询功能的一次实现过程
  • 微信小程序实战练习(仿五洲到家微信版)
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (zt)最盛行的警世狂言(爆笑)
  • (独孤九剑)--文件系统
  • (二)linux使用docker容器运行mysql
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (九)One-Wire总线-DS18B20
  • (转)memcache、redis缓存
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .java 9 找不到符号_java找不到符号
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .NET企业级应用架构设计系列之结尾篇
  • .pub是什么文件_Rust 模块和文件 - 「译」
  • @TableId注解详细介绍 mybaits 实体类主键注解
  • [④ADRV902x]: Digital Filter Configuration(发射端)
  • [AI aider] 打造终端AI搭档:Aider让编程更智能更有趣!
  • [C#]C#学习笔记-CIL和动态程序集
  • [C#]winform使用onnxruntime部署LYT-Net轻量级低光图像增强算法
  • [C++]18:set和map的使用
  • [C++]拼图游戏
  • [FlareOn5]Ultimate Minesweeper
  • [Flex][问题笔记]TextArea滚动条问题