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不看字节码是真的难懂的更多相关文章

  1. [原创]ASM动态修改JAVA函数之函数字节码初探

    ASM是非常强大的JAVA字节码生成和修改工具,具有性能优异.文档齐全.比较易用等优点.官方网站:http://asm.ow2.org/ 要想熟练的使用ASM,需要对java字节码有一定的了解,本文重 ...

  2. class字节码结构(一)(字节码结构和字节常量池的结构)

    <Java虚拟机原理图解> 1.1.class文件基本组织结构 关于变量的几个叫法: 局部变量/全局变量:很好区分根据所在位置. 类变量:静态的全局变量. 类常量:全局的final修饰的变 ...

  3. Python 字节码bytecode

    字节码bytecode python把源码文件编译成字节码文件,存放在__pycahe子目录内,用.pyc结尾.之后如果不再修改源码文件,运行时则使用*.pyc文件编译成机器码,这样不但运行速度快,而 ...

  4. IDEA字节码学习查看神器jclasslib bytecode viewer介绍

    转载来自:https://blog.csdn.net/w605283073/article/details/103209221 一.背景 很多人想学习Java反汇编后的字节码,但是一方面缺乏好的资料, ...

  5. 【Java虚拟机1】Java字节码文件格式入门

    第一次学习看字节码文件,这个对工作没什么用,但是会提升内功. 首先介绍两个IDEA插件以及使用: BinEd:以16进制格式查看class文件 使用方法:右键class文件,点击Open as bin ...

  6. 从字节码层面看“HelloWorld” (转)

    一.HelloWorld 字节码生成 众所周知,Java 程序是在 JVM 上运行的,不过 JVM 运行的其实不是 Java 语言本身,而是 Java 程序编译成的字节码文件.可能一开始 JVM 是为 ...

  7. 从 HelloWorld 看 Java 字节码文件结构

    很多时候,我们都是从代码层面去学习如何编程,却很少去看看一个个 Java 代码背后到底是什么.今天就让我们从一个最简单的 Hello World 开始看一看 Java 的类文件结构. 在开始之前,我们 ...

  8. 从字节码看java类型转换【 深入理解 (T[]) new Object[size] 】

    我们都知道,java中对类型的检查是很严格的,所以我们平操作时,也往往很小心. 如题: (T[]) new Object[size],这种写法是一般我们是不会干的!但是有点经验的同学,还是会遇到这样写 ...

  9. 从字节码看java中 this 的隐式传参

    从字节码看java中 this 隐式传参具体体现(和python中的self如出一辙,但是比python中藏得更深),也发现了 static 与 非 static 方法的区别所在! static与非s ...

随机推荐

  1. 两种方法设置MMDVM静态组

    方法一.进入BM页面设置静态组 1.仪表盘配置页面点击下图所示进入BM 2.或是点击链接进入https://brandmeister.network 3..进入页面后点击My hotspots,显示你 ...

  2. HDU - 2546 饭卡 题解

    题目大意 电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额.如果购买一个商品之前,卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后卡上余额为负),否则无法购买(即使金额足够) ...

  3. OAuth + Security - 6 - 自定义授权模式

    我们知道OAuth2的官方提供了四种令牌的获取,简化模式,授权码模式,密码模式,客户端模式.其中密码模式中仅仅支持我们通过用户名和密码的方式获取令牌,那么我们如何去实现一个我们自己的令牌获取的模式呢? ...

  4. idea针对有外联jar包的项目如何编译成可运行的jar包

    1.打开file-->project structure 2.如下图所示,创建 3.在空白处右键点击“create directory”创建一个“”“libs”文件夹 4.把项目所需的jar吧, ...

  5. Sublime Text 3.1 注册码

    加入到hosts文件: 127.0.0.1 www.sublimetext.com 127.0.0.1 license.sublimehq.com hosts 文件的位置: Windows : c:/ ...

  6. eclipse Luna 安装SVN插件

    Help--->Install New Soft ----> 输入 “Luna - http://download.eclipse.org/releases/luna” 这里显示都是 lu ...

  7. pip应用实例

    homepage 目录 1. 安装 1.1. 指定版本 1.2. 用户权限 1.3. 读取requirments.txt 1.4. 不使用缓存文件 1.5. 指定extras_require 2. 镜 ...

  8. Pants On Fire(链式前向星存图、dfs)

    Pants On Fire 传送门:链接  来源:upc9653 题目描述 Donald and Mike are the leaders of the free world and haven't ...

  9. pip速度过慢解决方法

    国内源: 新版ubuntu要求使用https源,要注意. 清华:https://pypi.tuna.tsinghua.edu.cn/simple 阿里云:http://mirrors.aliyun.c ...

  10. Spring AOP学习笔记03:AOP的核心实现之获取增强器

    上文讲了spring是如何开启AOP的,简单点说就是将AnnotationAwareAspectJAutoProxyCreator这个类注册到容器中,因为这个类最终实现了BeanPostProcess ...