`
benx
  • 浏览: 276186 次
  • 性别: 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 是索引器参数列表。接口可以由类和结构实现。为了指示类或结构实现接口,在该类...

    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...

    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...

    jdk-1_5_0_22-windows-i586-p

    javap用于反汇编Java类;jdb是Java的调试工具,等等。 压缩包中的"jdk-1_5_0_22-windows-i586-p.exe"很可能是Windows平台上的安装程序,适用于32位(i586)系统。这个.exe文件会引导用户完成JDK的安装过程,设置...

    VC快捷键全.txt

    - **F5、Ctrl+F10、F11、Alt+F10、Ctrl+F9、Alt+F11、Ctrl+Shift+F9、Ctrl+Shift+F5、Ctrl+Shift+F10**:这些组合键用于控制调试会话,包括运行、...执行、应用代码更改、设置断点、重启程序、切换到源视图或反汇编视图等...

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

    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进行系统调试和监控的工具结构图

    官方JDK1.6.26 I586(JDK1.6.26 32位)

    4. **开发工具**:除了基本的编译器和JVM,JDK还包括了其他开发工具,如`jar`用于打包和管理Java归档文件,`javadoc`用于生成API文档,`jmap`和`jhat`用于分析堆内存,`jconsole`提供JVM监控,还有`javap`反汇编器等...

    Java习题03类的方法.doc

    7. **i++和++i**:这是Java中的自增运算符。`i++`先使用当前的`i`值,然后增加1;`++i`则是先增加1再使用新值。两者在某些情况下会导致计算结果不同。 8. **错误的语句**:在Java中,变量声明必须以大写字母开头,...

    MAC版apk-tool和jd-gui

    Apk-tool是一个开源的工具,主要用于反编译APK文件,它能够解压APK,提取其中的资源文件(如XML布局、图片、音频等),并将Java字节码(.class文件)反汇编成人类可读的Smali代码。通过这种方式,开发者可以查看并...

    jad反编译工具详解

    - `-disass`:仅进行反汇编,不生成Java源代码。 - `-f`:控制字段声明的格式。 - `-ff`:控制方法之间的空行。 - `-i`:显示导入语句。 - `-l`:字符串常量的地址。 - `-lnc`:列出局部变量的名称和类型。 - `-nl`...

    北语-2018春《Java语言程序设计》作业1-满分答案.pdf

    8. **类文件解释器**:`javap`命令是Java类文件解释器,用于反汇编.class文件,查看字节码等信息。 9. **运算符分类**:运算符`+`属于算术运算符,它可以用于数字的加法运算,也可以用于字符串的连接。 10. **静态...

    2016-2020中考英代词和名词真题汇编.docx

    这篇文档汇集了2016年至2020年中考英语考试中关于代词和名词的部分真题,主要考察学生对代词的理解和运用能力,包括物主代词、不定代词、反身代词以及代词的用法辨析。 1. 物主代词的使用:题目涉及到了形容词性物...

    xjad2.2.zip

    标签 "jad" 指的是Java反汇编器,它能够将已编译的.class文件转换回接近源代码的形式。"eclipse" 是一个流行的开源集成开发环境(IDE),开发者可以在这个平台上编写、调试和运行Java项目。"myeclipse" 是另一个强大...

    jdk-1_5_0_17-windows-x64

    - **javap**: 反汇编Java字节码,展示类的详细信息。 **4. 类库升级** JDK 1.5还更新了许多核心类库,如`java.util.concurrent`包,提供了高级并发工具,如Executor框架、Future接口和并发集合,为编写高效的多...

    sd_SD_

    2. **编译器与反汇编器**:如何将汇编代码转换成机器可执行的二进制代码,以及如何将二进制代码反编译回汇编语言。 3. **硬件接口**:理解SD卡控制器的硬件接口,如I/O端口、时序等。 4. **SD卡协议**:熟悉SD卡的...

    Java程序设计练习题(3G软件开发).pdf

    javap.exe是Java反汇编器,可以将编译后的class文件反汇编成可读的Java字节码。 2. Java基础语法: 在Java中,基本数据类型包括int、byte、short、long、float、double、char和boolean。int[] a = new int[8]; 创建...

    java_JAVA复习资料,考试必过.pdf

    17. JDK工具:JDK包含了许多工具,如javac用于编译,Javap用于反汇编字节码,而Appletviewer是用于测试Applet的,不包含在最新的JDK版本中。 18. 无限循环:for(;;)是一个无限循环,所以A) 是正确的循环体。 19. ...

Global site tag (gtag.js) - Google Analytics