`

i++ 与 ++i (珠海20090326)

阅读更多
1.
i++:先取i值,然后i+1
++i:先i+1,然后取i值
所以单单是++i;或i++是没有什么区别的.但在while(i++>10)~~~,或if(++i<9)的时候就要考虑取值先后问题.

2.
int i,j;
i=1;
j=i++;     //j=++i;

以上代码,j=i++之后,得j=1,i=2;j=++i之后,是j=2,i=2.
3.
int i=1;
i=++i;    //i = i++; 

前者i的值是2;而后者依然是1.
不是增值1的吗?为什么后者还是1?
原因就要说一下java文件,编译成class文件的字节码了.

你可以使用javap -c  *** 看下程序的汇编代码

int i = 0;
i = i++;

Code:
   0:   iconst_0        //将int类型常量0压入栈
   1:   istore_1        //将int类型值存入局部变量1
   2:   iload_1         //从局部变量1中装载值
   3:   iinc    1, 1    //局部变量1的值+1
   6:   istore_1        //存入局部变量1中
   7:   return          //函数结束

所以它是先赋值,i=i(即i=0),然后对一个局部变量进行了+1操作

int i = 0;
i = ++i;

  Code:
   0:   iconst_0       //将int类型常量0压入栈
   1:   istore_1       //将int类型值存入局部变量1
   2:   iinc    1, 1   //局部变量1的值+1
   5:   iload_1        //从局部变量1中装载值
   6:   istore_1       //存入局部变量1中
   7:   return         //函数结束


iconst_0的i代表int类型,const代表常量,0代表值为0.

可以这样理解一下,
int i=1;i=++i;是先int temp;temp = i(1);temp = i+1(2);再赋值i,i=temp(2);
int i=1;i=i++;//int temp;temp = i(1);这时就赋值了i=temp(1);同时temp又被清理了,所以再i=i++; n次也是只能i值为1.



参考:
  1. 关注性能: 宏性能基准测试
  2. http://www.ibm.com/developerworks/cn/java/j-perf12053/index.html
  3. 变量声明到底在循环外部好还是在循环内部好?
  4. http://blog.csdn.net/virtualman2000/archive/2006/08/29/1138496.aspx
  5. JAVA经验谈:尽可能使用堆栈变量
  6. http://www.bianceng.cn/java/j33.htm
  7. 主题:深入了解Java ClassLoader Bytecode  ASM cglib
  8. http://www.iteye.com/topic/98178

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics