`
benx
  • 浏览: 271495 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

通过反汇编class看i++和++i的区别

    博客分类:
  • java
阅读更多
       public void method4() {
		int i = 1;
		int j = 2;
		
		int a = i++;
		int b = ++j;
	}






使用javap -c 解开class后


           0:   iconst_1    //从常量池取出1放入操作栈顶
	   1:   istore_1    //把操作栈顶元素保存到本地变量i中 i=1
	   2:   iconst_2    //从常量池取出2放入操作栈顶
	   3:   istore_2    //把操作栈顶元素保存到本地变量j中 j=2
	   4:   iload_1     //把本地变量i放入操作栈顶i=1
	   5:   iinc    1, 1    //执行把本地变量i+1 ,操作栈顶不变
	   8:   istore_3        //把操作栈顶元素保存到本地变量a中
	   9:   iinc    2, 1    //执行把本地变量j+1 ,操作栈顶不变
	   12:  iload_2         //把本来变量j放入栈顶 j=3
	   13:  istore  4       //把栈顶j保存到本地变量,即b=3
	   15:  return
 


预备知识:
iconst 把int型数据放到操作栈顶
istore 把栈顶int元素保存到本地变量,移除栈顶元素
iload int本地变量放入栈顶
iinc 把int元素自动+1        如iinc 1,1  第一位是本地变量index,第二位是+的数值
iinc 不会改变栈顶元素的值,它只会改变本地变量的值

不知大家从上面的jvm 指令可以他们之前的不同没?
后++ 的顺序是load ----iinc---store
先++ 的顺序是iinc ----load---store
先前说过iinc不会改变栈顶,会直接修改本地变量的值,所有后++会把先前load的值原封不动的保存进去
而后++会先改变本地变量值,然后把本地变量捞出来,再保存

所以如果++i 和i++ 如果用于自增这两个是没有区别的,都相当于i=i+1,但如果是通过这个来赋值
如 int a = i++;   int b = ++j; 那么a保存i原有值,b= j+1


注意
int i = 1; System.out.println(i++);

int i = 1;i++; System.out.println(i);
的区别,原理和上面一样
分享到:
评论

相关推荐

    c#学习笔记.txt

    接口成员是通过 I.M 和 I[A] 形式的成员访问和索引访问表达式访问的,其中 I 是接口类型的实例,M 是该接口类型的方法、属性或事件,A 是索引器参数列表。接口可以由类和结构实现。为了指示类或结构实现接口,在该类...

    DeDeDark.rar

    02.DIY原DEDE,使得可以反汇编得到非标准程序的Forms格式和Procedures的事件(^_^) 03.直接反汇编功能的选项,原DEDE就提供了 "When this is checked DeDe will try to load the target and will read some valueable...

    DeDe_3.10_1527.rar

    02.DIY原DEDE,使得可以反汇编得到非标准程序的Forms格式和Procedures的事件(^_^) 03.直接反汇编功能的选项,原DEDE就提供了 "When this is checked DeDe will try to load the target and will read some valueable...

    语言程序设计课后习题答案

    2-14 if ( x = 3 ) 和 if (x = = 3) 这两条语句的差别是什么? 解: 语句if(x = 3)把3赋给x,赋值表达式的值为true,作为if语句的条件;语句if(x == 3)首先判断x的值是否为3,若相等条件表达式的值为ture,否则为...

    jdk-6u45-windows-i586 & x64

    jdk1.6安装教程及环境变量配置: 双击运行"jdk-6u45-windows-x64.exe"程序,依...Javap:Java反汇编器,显示编译类文件中的可访问功能和数据,同时显示字节代码含义。 Jconsole: Java进行系统调试和监控的工具结构图

    oa源码 大型oa asp.net 源码

    public partial class login2 : Page { [AccessedThroughProperty("chpwd")] private ImageButton _chpwd; [AccessedThroughProperty("dropBranch")] private DropDownList _dropBranch; ...

    C++复习资料之系列

    (a) 解释 (b) 汇编 (c) 编辑 (d) 编译 3.C++程序基本单位是( c )。 (a) 数据 (b) 字符 (c) 函数 (d) 语句 4. C++程序中的语句必须以( b )结束。 (a) 冒号 (b) 分号 (c) 空格 (d)花括号 5. 执行C++程序时...

    零基础入门Android(安卓)逆向-rar

    32.Android源码定制添加反反调试机制 ' v/ q6 K1 {6 ] 33.Android dvm 脱壳2 34.Android dvm 脱壳3 H2 X- A# M4 s+ A6 K- b 35.Dalvik dex处理分析 ) x+ l1 l1 J R2 N) T" R) ^2 o 36.IDA脱壳脚本编写1) O7 `% E" Q...

    JAVA上百实例源码以及开源项目

    2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...

    JAVA上百实例源码以及开源项目源代码

    2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...

    vc++ 开发实例源码包

    OD反汇编引擎(带VC修改版和原版) 如题。主要文件就4个,非常适合学习,详细见源码。 OPENG开发的示例代码c++版 演示了OpenG的使用方法,内含几个实例,一个实例就3个文件。 p2p vb实例。 p2p+technology 文档。 ...

    C#微软培训资料

    17.1 .Net 框架结构提供的 I/O 方式 .215 17.2 文件存储管理 .217 17.3 读 写 文 件 .222 17.4 异步文件操作 .227 17.5 小 结 .234 第十八章 高 级 话 题 .235 18.1 注册表编程 .235 18.2 在 C #代码...

    java开源包1

    目前它包含一个完整的虚拟机以及一个 javap 字节码反汇编器。 brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当...

    java开源包11

    目前它包含一个完整的虚拟机以及一个 javap 字节码反汇编器。 brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当...

    java开源包2

    目前它包含一个完整的虚拟机以及一个 javap 字节码反汇编器。 brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当...

    java开源包3

    目前它包含一个完整的虚拟机以及一个 javap 字节码反汇编器。 brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当...

    java开源包6

    目前它包含一个完整的虚拟机以及一个 javap 字节码反汇编器。 brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当...

    java开源包5

    目前它包含一个完整的虚拟机以及一个 javap 字节码反汇编器。 brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当...

    java开源包10

    目前它包含一个完整的虚拟机以及一个 javap 字节码反汇编器。 brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当...

Global site tag (gtag.js) - Google Analytics