首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

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

2012-11-01 
通过反汇编class看i++和++i的区别0:iconst_1//从常量池取出1放入操作栈顶1:istore_1//把操作栈顶元素保存

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

           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);
的区别,原理和上面一样

热点排行