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
时间: 2024-11-25 20:46:33