Java之路

深入理解i++和++i

 1 int i=0;
 2 int j=i++;//i=1;j=0;
 3 
 4 int i=0;
 5 int j=++i;//i=1;j=1;
 6 
 7 int i=0;
 8 i=i++;//i=0;
 9 
10 int i=0;
11 i=++i;//i=1;



i++:
iconst_0
istore_1
iload_1
iinc 1,1
istore_1

++i:
iconst_0
istore_1
iinc 1,1
iload_1
istore_1





总结:
i=i++没有意义,不要在代码里出现为好,以免误导他人。也不建议用i=++i。

posted on 2009-07-25 18:57 小良良 阅读(1670) 评论(7)  编辑  收藏

评论

# re: 深入理解i++和++i 2009-07-25 21:11 ahx

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

结果为1 是么?
编译器:
gcc version 4.3.3
代码:
#include <stdio.h>

int main(int argc , char** argv){
int i = 0;
i = i ++;
fprintf(stdout,"%d",i);
}
运行结果:
1
  回复  更多评论   

# re: 深入理解i++和++i 2009-07-25 21:21 ahx

抱歉,没有注意“Java之路”
编译器:javac 1.6.0_14
代码:
class Tt{
public static void main(String[] args){
int i = 0;
i = i++;
System.out.println(i);
}
}
结果:0  回复  更多评论   

# re: 深入理解i++和++i 2009-07-25 21:43 小良良

@ahx
多才!  回复  更多评论   

# re: 深入理解i++和++i 2009-07-25 23:50 Jacky-Q

常识吧。讲运算符时都会提到这一点。  回复  更多评论   

# re: 深入理解i++和++i 2009-07-26 06:51 feenn

@ahx
正确。先执行赋值操作,然后执行增量操作。  回复  更多评论   

# re: 深入理解i++和++i 2009-07-26 15:16 木糖醇

@ahx

很希望在给多种代码演示的时候说明下是哪种语言..
我们新手看起来就没那么懵了...
也可以长长知识...谢谢!  回复  更多评论   

# re: 深入理解i++和++i[未登录] 2009-07-26 22:12 lanxiazhi

我来具体说明:
int i=0;
i=i++;
上述两行java代码bytecode如下:
iconst_0 //把常量0放到堆栈
istore_1 //把堆栈上的数(上面那个0)放到存储位置1,也就是i的存储位置,所以i的值就是0了
iload_1 //加载位置1上的整数值到栈顶,就是i,因此栈顶的值是0
iinc 1,1 //把位置1的数,也就是i,自增1,因此i变成了1(注意:iinc指令不会操作堆栈)
istore_1 //把栈顶的那个数,也就是0,存到位置1,因此i的值是0.

int i=0;
i=++i;
-->
iconst_0 //把常量0放到栈顶
istore_1 //把堆栈上的数(上面那个0)放到存储位置1,也就是i的存储位置,所以i的值就是0了,栈顶值不变
iinc 1,1 //把位置1的数,也就是i,自增1,因此i变成了1(注意:iinc指令不会操作堆栈)
iload_1 //加载位置1的数,也就是i的值,1,到栈顶
istore_1//把栈顶的值存到位置1,因此i的值就是1了。

了解字节码的操作:
http://blog.csdn.net/BU_BetterYou/archive/2008/06/16/2553108.aspx
  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 

导航

<2009年7月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

统计

常用链接

留言簿

随笔分类

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜