对于如下代码,思考一下输出结果是什么?
int a[] = {5, 8, 7, 6, 2, 7, 3};
int y, *p = &a[1];
y = (*--p)++;
printf("%d ",y);
printf("%d",a[0]);
这个代码看似简单,但是在“y = (*--p)++;”这行代码里,编译器做了很多工作。
我们在vs2022的环境下,反汇编得到下面的x86汇编代码:
00E2196F mov eax,dword ptr [p]
00E21972 sub eax,4
00E21975 mov dword ptr [p],eax
00E21978 mov ecx,dword ptr [p]
00E2197B mov edx,dword ptr [ecx]
00E2197D mov dword ptr [y],edx
00E21980 mov eax,dword ptr [p]
00E21983 mov ecx,dword ptr [eax]
00E21985 add ecx,1
00E21988 mov edx,dword ptr [p]
00E2198B mov dword ptr [edx],ecx
前6行就不讨论了,简单的说就是它把指针往前移动一个位置,然后解引用把里面的值赋值给y。
但是后面的部分,也就是从第7行开始,我们需要重点理解。
mo