用i=i++ + ++i带你入门javap

原创 2004年07月13日 14:27:00

关键字:java   javap
和作者联系:xiaozuidaizhi@sina.com
============================================================================================
 摘要: javap是一个很好的深入查看程序内部运行机制的工具,不过它有不同于汇编的自有格式的语句。本文
通过用javap对i=i++ + ++i 这一特殊语言现象进行分析,带你进入javap的微观世界。
============================================================================================
        首先我们来了解一下javap命令及其基本用法。
javap是sun提供的对class文件进行反编译的工具,javap和javac、java等bin文件存放路径相同,当你配置好了环
境变量后,javap就和javac、java等命令的用法类似了。
        javap最基本的用法,也是最常用的用法如下:
        javap -[参数] test
        其中,test是test.java文件经javac编译后产生的class文件名,也就是说,在javap之前,你必须用javac编译这
个文件,需要注意的一点是,在使用javap反编译.class文件时,不要带上其后缀名,否则会报错。
        我们对javap最常用的参数是c,也就是形如
javap -c test  的用法,如果你还想对javap的参数进一步了解的话,
我向你推荐
www.javaresearch.org  的一篇文章《javap简介》,你可以在该网站的首页上通过查询该标题得到这
篇文章。
下面我们进入正题:

  • 第一例
     int i = 0;
     i=i++ + ++i;

     Code:
      0:   iconst_0          将 0 推到堆栈中//对应赋值语句 int i = 0;iconst_0中的0为初始值
      1:   istore_1          从堆栈中弹出这个值,并将它存储到局部变量表的索引 1 处 //对应赋值语句,上句是
                              赋值,这句是存储,索引1
    处即为i,因为没有其它变量,所以本例中局部变量的索引不变
      2:   iload_1           将局部变量表索引 1 处的值推到堆栈中//将局部变量索引1处的计算结果推入堆栈临时
                              存储,局部变量的索引从1
    开始,依此类推,这句意味着将变量i=0先推入堆栈临时存储
      3:   iinc    1, 1       局部变量表索引 1 处的变量加 1 //将变量i自加1,则此时变量i为1
      6:   iinc    1, 1       局部变量表索引 1 处的变量加 1 //再将变量i自加1,则此时变量i为2
      9:   iload_1           将局部变量表索引 1 处的值推到堆栈中//将变量i=2推入堆栈临时存储
      10:  iadd               从操作数堆栈中弹出两个整数并让它们相加。将得到的整数推回堆栈中//将两次暂存的
                             整数相加,即0+2=2
      11:  istore_1        从堆栈中弹出这个值,并将它存储到局部变量表的索引 1 处//把上步相加之结果弹出
                              堆栈
      12:  return             从堆栈中弹出值并将它推到调用方法的操作数栈中。退出方法//将i=2返回,计算结束
  • 第二例

    int i=0;
     i = ++i + i++;

     Code:
      0:   iconst_0          将 0 推到堆栈中//对应赋值语句 int i = 0;iconst_0中的0为初始值
      1:   istore_1           从堆栈中弹出这个值,并将它存储到局部变量表的索引 1 处 //对应赋值语句,上句
                            是赋值,这句是存储
      2:   iinc    1, 1       局部变量表索引 1 处的变量加 1 //将变量i自加1,则此时变量i为1
      5:   iload_1          将局部变量表索引 1 处的值推到堆栈中//将变量i=1推入堆栈临时存储
      6:   iload_1          将局部变量表索引 1 处的值推到堆栈中//将变量i=1推入堆栈临时存储
      7:   iinc    1, 1       局部变量表索引 1 处的变量加 1 //再将变量i自加1,则此时变量i为2
      10:  iadd               从操作数堆栈中弹出两个整数并让它们相加。将得到的整数推回堆栈中//将两次暂存的
                            整数相加,即0+2=2  注意:虽然上步让i=2,但是并没有推入堆栈作存储
      11:  istore_1         从堆栈中弹出这个值,并将它存储到局部变量表的索引 1 处//把上步相加之结果弹出堆栈
      12:  return             从堆栈中弹出值并将它推到调用方法的操作数栈中。退出方法//将i=2返回,计算结束
    ======================================================================================

      下面给出的是较为复杂一点的例子,供读者自行分析。

int i=0;
i= i++ + ++i;
int j=0;
j= ++j + ++j;

 Code:

 0:   iconst_0
 1:   istore_1
 2:   iload_1
 3:   iinc    1, 1
 6:   iinc    1, 1
 9:   iload_1
 10:  iadd
 11:  istore_1
 12:  iconst_0
 13:  istore_2
 14:  iinc    2, 1
 17:  iload_2
 18:  iinc    2, 1
 21:  iload_2
 22:  iadd
 23:  istore_2
 24:  return

 

浅谈java之++i和i++区别

浅谈java之++i和i++区别                   今天简单谈谈关于java的一个误区,相信很多刚开始学习java的朋友都会遇到这个问题,虽然问题很简单,但是经常容易搞混,说说jav...
  • u011747761
  • u011747761
  • 2015年01月09日 16:31
  • 10301

C++中的++i和i++

最近虽然比较忙,也有点压力,不过相对还是闲的时间多,花了些时间看了些书。 还是感觉要写点什么,就从这里开始吧。 写在前面:--i和i-- 与 ++i和i++ 相似,这里仅讨论后者。 一、对于内...
  • qq_35154908
  • qq_35154908
  • 2016年10月19日 10:52
  • 724

C语言i++和++i的区别

i++和++i的区别虽然简单,还是记录一下吧!     【知识点】      1. 对于普通独立的语句,i++和++i是一样的,如:         i++; 等效于i=i+1;         +...
  • u013046097
  • u013046097
  • 2016年12月03日 11:09
  • 1717

Java中i++和++i的区别

说来惭愧,从事开发工作也有一年时间了,然而在今天的一个业务逻辑里突然发现原来我对i++和++i都没有理解,或者说我之前的理解是错误的。这对于一个有追求的程序猿是不能容忍的。知道之后,迅速恶补学习,现在...
  • qq_34471736
  • qq_34471736
  • 2017年01月18日 11:41
  • 3314

c语言中i++与++i的区别及运行效率

在c语言我们会经常把i++与++i弄混淆。 i++    是先使用,再自加(其自加是在遇到结束标志时才会进行) 即a = i;i=i+1; ++i    是先自加,再使用 即 i=i+1; a...
  • Mormont
  • Mormont
  • 2016年11月11日 19:39
  • 4302

一个有趣的C语言问题:s = (++i) + (++i) + (++i)

一个有趣的C语言问题:s = (++i) + (++i) + (++i)
  • u010084308
  • u010084308
  • 2014年09月22日 21:22
  • 2646

C#中的i++和++i

刚刚学习C#的时候,难免会遇到一些麻烦,而我觉得最有意思的是i++和++i。 先介绍下它们吧!!i++ 俗称后加加:在处理运算的时候先不做运算,等输出的时候再加,这是我个人的理解。 ++i 俗称先加加...
  • mango_love
  • mango_love
  • 2015年08月03日 23:54
  • 777

java i++和++i的区别

//i++和++i是有区别的, //i++和++i都代表着i=i+1; //i++是在一个先使用原值,然后加1,即先使用i的值,后让i+1. //++i则是先加1后使用,即先让i+1后再使用i的新值....
  • q2267671366
  • q2267671366
  • 2014年12月23日 14:36
  • 2606

关于cout中连续i++的执行顺序

[C++]关于i++和++i的学习 MoaKap 今天在论坛上无意中看到有人问关于i++和++i的问题,感觉自己也不怎么熟悉,就仔细看了一下。感觉有位大侠的回复相当不错,很有特色,把问题讲...
  • seumonkey
  • seumonkey
  • 2014年02月26日 10:50
  • 1484

java中的i++ 和 ++i 以及 for循环

今天在看java的i++  和++i 的区别,感觉自己还是会绕。正好整理下。 i++:先赋值,后计算; ++i;先计算,后赋值。 看下面代码:public class Text { public s...
  • allenjay11
  • allenjay11
  • 2016年04月14日 21:14
  • 2582
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用i=i++ + ++i带你入门javap
举报原因:
原因补充:

(最多只允许输入30个字)