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. 关于C#委托三种调用的分享

    一.同步调用 1.同步调用会按照代码顺序来执行2.同步调用会阻塞线程,如果是要调用一项繁重的工作(如大量IO操作),可能会让程序停顿很长时间,造成糟糕的用户体验,这时候异步调用就很有必要了. 举个栗子 ...

  2. shell中文本内容多行变一行的技巧

    在linux下有时可能需要将多行的值转成一行.其实现的方法有很多种.笔者将自己曾经用过的方法在些分享. 如有一文本文件5201351.txt,文本的内容如下: 现我们可以通过如下方法将文本内容转成一行 ...

  3. OC语言-NSMutableArray为什么要用strong来修饰

    Talk is cheap show you my code!  NSMutableArray属性为什么要用strong来修饰,其实就是一个深复制和浅复制的问题. <pre name=" ...

  4. cnblogs 博客爬取 + scrapy + 持久化 + 分布式

    目录 普通 scrapy 分布式爬取 cnblogs_spider.py 普通 scrapy # -*- coding: utf-8 -*- import scrapy from ..items im ...

  5. jQuery中ajax 跳入error的原因总结

    一个标准的jquery的ajax代码: $.ajax({ type: 'POST', url: 'getSecondClassification', data: {"sort2": ...

  6. cheerio html方法中文被编码问题

    var $ = cheerio.load("<h1><p>你好</p><em>Hello,World!</em></h1&g ...

  7. 2019-02-01 Python爬虫爬取豆瓣Top250

    这几天学了一点爬虫后写了个爬取电影top250的代码,分别用requests库和urllib库,想看看自己能不能搞出个啥东西,虽然很简单但还是小开心. import requests import r ...

  8. drf之框架基础

    (一)drf基础 全称:django-rest framework 接口:什么是接口.restful接口规范(协议) CBV(基于FBV的基础上形成).CBV生命周期源码----基于restful规范 ...

  9. 【01JMeter基础】线程组

    线程组 我们存在接口请求的地方,在JMeter中我们使用最多的模块,分为 setUp线程组.线程组.tearDown线程组 setUp线程组:不论如何排序,都会在所有的线程组中被最早执行,如果有多个s ...

  10. 良心之作送你几个Xsheel使用小技巧

    ❝ 工作中无可避免的会使用到Xsheel,接下来咔咔给你介绍几个小技巧,让你工作游刃有余. ❞ 一.告别繁琐 你的Xsheel连接后是不是这样的 哦!这个也太烦了我至少得在敲俩次命令才能到我的工作目录 ...