码迷,mamicode.com
首页 > 其他好文 > 详细

令人纠结无比的a[i++]=i++

时间:2014-08-25 13:27:44      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:汇编   调试   i++   

	int j = 0;
	int a[10];
	a[++j]=j++;
	
	int j = 0;
	int a[10];
	a[++j]=++j;


	
	int j = 0;
	int a[10];
	a[j++]=j++;
	
	int j = 0;
	int a[10];
	a[j++]=++j;

今天朋友问我,上面四个式子执行后,数组a的值分别是什么


正确答案是a[1] = 0, a[2] = 2, a[0]=0, a[1] = 1。和大部分人一样,我第一次也答错了。这四个式子看起来让人头晕,结果好像也十分奇怪。

因此我对这些代码用反汇编窗口进行调试

bubuko.com,布布扣

bubuko.com,布布扣

bubuko.com,布布扣

bubuko.com,布布扣

bubuko.com,布布扣


可以发现,含有j++的表达式,其中最后的j=j+1的递增操作总是在最后执行,看到这里想必大家都发现貌似j++的两个基本操作被打散了,它们不再是紧挨着执行了(不是返回j之后立马自增)。同时可以看到此时赋值操作总是在++j操作完成后进行。换句话说,当一行表达式中的++j全部计算完毕之后,再把表达式中的所有j全部替换成更新之后的值。若表达式还有j++,则最后执行j++的操作。

举个例子

	int j = 0;
	int a[10];
	a[j++]=++j;
有一个++j,则表达式

a[j++]=++j等价于a[j]=j,(j=1),j++,故结果为a[1]=1,j=2


        int j = 0;
	int a[10];
	a[j++]=j++;

没有++j表达式

a[j++]=j++等价于a[j]=j,(j=0),j++,故结果为a[0]=0,j=1


令人纠结无比的a[i++]=i++

标签:汇编   调试   i++   

原文地址:http://blog.csdn.net/lampqiu/article/details/38817763

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!