i++ & ++i不看字节码是真的难懂
package club.interview.base; /**
* ++i 先"++"后赋值
* i++ 先赋值后"++"
* i++ 局部变量表的值会改变,但是操作数栈并不会变,后面需要使用会把局部变量表中的值放入操作数栈
* <p>
* --- 参考内容 (你值得拥有)
* * jvms文档
* * jclasslib 工具插件
*
* @author QuCheng on 2020/7/6.
*/
public class IAdd { /**
* i++是先赋值后++ ++i是先++后赋值
* 计算机是逐个击破,不是先搜索所有运算法
* 0 iconst_2
* 1 istore_1
* 2 iload_1 栈 [2]
* 3 iinc 1 by 1
* 6 iload_1 栈 [3,2]
* 7 iadd 栈 [5]
* 8 iinc 1 by 1
* 11 iload_1 [4,5]
* 12 iadd [9]
* 13 iload_1 [4,9]
* 14 iadd [13]
* 15 istore_1 []
* 16 getstatic #2 <java/lang/System.out>
* 19 iload_1 [13]
* 20 invokevirtual #3 <java/io/PrintStream.println> []
* 23 return
*/
private void sunmmary() {
int i = ;
// // 2 3 4 4
i = i++ + i + ++i + i;
System.out.println(i);
} /**
* 局部变量表 -> lvt
* 0 iconst_0 将0push到栈顶
* 1 istore_1 将0从栈顶弹出 lvt(index1 = 0)
* 2 iinc 1 by 1 栈空 lvt(index1 = 1)
* 5 getstatic #2 <java/lang/System.out>
* 8 iload_1 栈顶为1 lvt(index1 = 1)
* 9 invokevirtual #3 <java/io/PrintStream.println>
* 12 return
*/
private void step1() {
int i = ;
i++;
System.out.println(i);
} /**
* 0 iconst_0 将常量0放入操作数栈栈顶 栈顶为0
* 1 istore_1 将栈顶的int元素赋值给局部变量表第1个位置(弹出)| 栈空 局部变量表index1为0
* 2 iload_1 将局部变量表第1个位置的值push到操作数栈栈顶 | 栈顶为0 局部变量表index1为0
* 3 iinc 1 by 1 将第一个位置的局部变量加1(by 1) | 0-> 1 栈顶为0 局部变量表index1为1
* 6 istore_1 同上(赋值) | 栈空 局部变量表index1为0 (被覆盖)
* 7 getstatic #2 <java/lang/System.out>
* 10 iload_1 读取局部变量1位置到栈顶 | 栈顶为0 局部变量表index1为0
* 11 invokevirtual #3 <java/io/PrintStream.println> 打印是将局部变量表中的值放入操作数栈栈顶,然后读取
* 14 return
*/
private void test2() {
int i = ;
i = i++;
System.out.println(i);
} /**
* 0 iconst_0
* 1 istore_1
* 2 iload_1 (理解的关键点 把局部变量表中index1位置的值放入栈顶 为了之后赋值)
* 3 iinc 1 by 1
* 6 istore_2 lvt(index2 = 0)
* 7 getstatic #2 <java/lang/System.out>
* 10 iload_1 将lvt(index1 = 1) 放入栈顶
* 11 invokevirtual #3 <java/io/PrintStream.println>
* 14 getstatic #2 <java/lang/System.out>
* 17 iload_2 将lvt(index2 = 0) 放入栈顶
* 18 invokevirtual #3 <java/io/PrintStream.println>
* 21 return
*/
private void step3() {
int i = ;
int j;
j = i++;
System.out.println(i);
System.out.println(j);
} private void step4() {
int i = ;
int j;
j = ++i;
System.out.println(i);
System.out.println(j);
} public static void main(String[] args) {
IAdd i = new IAdd();
i.sunmmary();
}
}
i++ & ++i不看字节码是真的难懂的更多相关文章
- [原创]ASM动态修改JAVA函数之函数字节码初探
ASM是非常强大的JAVA字节码生成和修改工具,具有性能优异.文档齐全.比较易用等优点.官方网站:http://asm.ow2.org/ 要想熟练的使用ASM,需要对java字节码有一定的了解,本文重 ...
- class字节码结构(一)(字节码结构和字节常量池的结构)
<Java虚拟机原理图解> 1.1.class文件基本组织结构 关于变量的几个叫法: 局部变量/全局变量:很好区分根据所在位置. 类变量:静态的全局变量. 类常量:全局的final修饰的变 ...
- Python 字节码bytecode
字节码bytecode python把源码文件编译成字节码文件,存放在__pycahe子目录内,用.pyc结尾.之后如果不再修改源码文件,运行时则使用*.pyc文件编译成机器码,这样不但运行速度快,而 ...
- IDEA字节码学习查看神器jclasslib bytecode viewer介绍
转载来自:https://blog.csdn.net/w605283073/article/details/103209221 一.背景 很多人想学习Java反汇编后的字节码,但是一方面缺乏好的资料, ...
- 【Java虚拟机1】Java字节码文件格式入门
第一次学习看字节码文件,这个对工作没什么用,但是会提升内功. 首先介绍两个IDEA插件以及使用: BinEd:以16进制格式查看class文件 使用方法:右键class文件,点击Open as bin ...
- 从字节码层面看“HelloWorld” (转)
一.HelloWorld 字节码生成 众所周知,Java 程序是在 JVM 上运行的,不过 JVM 运行的其实不是 Java 语言本身,而是 Java 程序编译成的字节码文件.可能一开始 JVM 是为 ...
- 从 HelloWorld 看 Java 字节码文件结构
很多时候,我们都是从代码层面去学习如何编程,却很少去看看一个个 Java 代码背后到底是什么.今天就让我们从一个最简单的 Hello World 开始看一看 Java 的类文件结构. 在开始之前,我们 ...
- 从字节码看java类型转换【 深入理解 (T[]) new Object[size] 】
我们都知道,java中对类型的检查是很严格的,所以我们平操作时,也往往很小心. 如题: (T[]) new Object[size],这种写法是一般我们是不会干的!但是有点经验的同学,还是会遇到这样写 ...
- 从字节码看java中 this 的隐式传参
从字节码看java中 this 隐式传参具体体现(和python中的self如出一辙,但是比python中藏得更深),也发现了 static 与 非 static 方法的区别所在! static与非s ...
随机推荐
- Java实现第十届蓝桥杯特别数的和
试题 F: 特别数的和 时间限制: 1.0s 内存限制: 512.0MB 本题总分:15 分 [问题描述] 小明对数位中含有 2.0.1.9 的数字很感兴趣(不包括前导 0),在 1 到 40 中这样 ...
- java实现第六届蓝桥杯奇妙的数字
奇妙的数字 奇妙的数字 小明发现了一个奇妙的数字.它的平方和立方正好把0~9的10个数字每个用且只用了一次. 你能猜出这个数字是多少吗? 请填写该数字,不要填写任何多余的内容. 结果:69 impor ...
- java实现第六届蓝桥杯牌型整数
牌型整数 题目描述 小明被劫持到X赌城,被迫与其他3人玩牌. 一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张. 这时,小明脑子里突然冒出一个问题: 如果不考虑花色,只考虑点数,也不 ...
- Linux 文件特殊权限-SetUID
SetUID非常类似于Windows中以管理员身份来运行文件,针对的是可执行文件,而且命令执行者要拥有对这个文件的执行权限,只在文件执行的过程中变换身份,最常见的passwd命令就具有SetUID权限 ...
- Linux文件处理命令touch、cat、more、head详解
命令touch详解 命令touch,所在路径及执行权限为: 可以看到,命令的路径为:/usr/bin/touch ,所以它的执行权限为所有用户 命令基本功能是创建空文件 (可以同时创建多个空文件,文件 ...
- Firewalld 的基本使用
RHEL 7 系统中集成了多款防火墙管理工具,其中 firewalld(Dynamic Firewall Manager of Linux systems,Linux 系统的动态防火墙管理器)服务是默 ...
- mysql常见聚合函数
count():总数量avg():平均数std():标准差sum():求和max():最大值min():最小值 上面的不过多介绍group_concat():分组列值全部展示到一行eg:mysql&g ...
- 在Centos7中,从主机 Windows 上无法远程访问 Linux 上rabbitmq的解决方法
当在 Linux 上配置好 Rabbitmq服务器后,如果从主机中无法访问到 Linux 中的Rabbitmq服务器时,需要做如下的检查: 1. Rabbitmq是否启动成功 在控制台输入: ps - ...
- 在MS SQL(SSMS中)_Format_SQL_更改设置_增加命令
在MS SQL(SSMS中)_Format_SQL_更改设置_增加命令 目的:要格式化这么一段SQL语句(这是随便从网上Copy的一段),没细看内容,反正看到头疼,乱七八糟的不想看. select b ...
- 恕我直言你可能真的不会java第3篇:Stream的Filter与谓词逻辑
一.基础代码准备 建立一个实体类,该实体类有五个属性.下面的代码使用了lombok的注解Data.AllArgsConstructor,这样我们就不用写get.set方法和全参构造函数了.lombok ...