首页 > 代码库 > 令人纠结无比的a[i++]=i++

令人纠结无比的a[i++]=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。和大部分人一样,我第一次也答错了。这四个式子看起来让人头晕,结果好像也十分奇怪。

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





可以发现,含有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++