首先看一下代码:
#include <stdio.h>
void main()
{
int i=10;
printf("%d %d %d %d %d\n",i--,--i,++i,i++,i);
}
开始我的预测答案是:11 11 12 10 10
运行后:11 10 10 10 10
开始我认为是printf的问题就用函数进行了输出,代码如下:
#include <stdio.h>
void fun(int a,int b,int c,int d,int f)
{
printf("%d %d %d %d %d\n",a,b,c,d,f);
}
void main()
{
int i=10;
fun(i--,--i,++i,i++,i);
}
然而结果还是11 10 10 10 10
所以就对前一段代码进行了反汇编,看一下汇编是如何处理这个的:
运算过程:
00B13C25 mov eax,dword ptr [i] 从i中取出值放入eax寄存器中
00B13C28 mov dword ptr [ebp-0D0h],eax 将寄存器的值保存在临时量中
00B13C2E mov ecx,dword ptr [i] 取出i的值,加一后写回i
00B13C31 add ecx,1
00B13C34 mov dword ptr [i],ecx
00B13C37 mov edx,dword ptr [i] 取出i的值,加一后写回i
00B13C3A add edx,1
00B13C3D mov dword ptr [i],edx
00B13C40 mov eax,dword ptr [i] 取出i的值,加一后写回i
00B13C43 sub eax,1
00B13C46 mov dword ptr [i],eax
00B13C49 mov ecx,dword ptr [i] 取出i的值,保存在临时量中
00B13C4C mov dword ptr [ebp-0D4h],ecx
00B13C52 mov edx,dword ptr [i] 取出i的值,加一后写回i
00B13C55 sub edx,1
00B13C58 mov dword ptr [i],edx
输出过程:
00B13C5D mov eax,dword ptr [i] 从I中取出值放入寄存器中后入栈
00B13C60 push eax
00B13C61 mov ecx,dword ptr [ebp-0D0h] 从保存后置++的ebp-0D0h中取出值放入寄存器后入栈
00B13C67 push ecx
00B13C68 mov edx,dword ptr [i] ++i
00B13C6B push edx
00B13C6C mov eax,dword ptr [i] --i
00B13C6F push eax
00B13C70 mov ecx,dword ptr [ebp-0D4h] i--
00B13C76 push ecx
从上面的汇编可以看出:编译器在处理前置,和后置时是不一样的。
在处理后置时:是将值放入临时量中,在输出时直接从临时量中取值
在处理前置时:是等运算完成后,直接从I的地址中取值
所以才会出现上面那种与我们以前的想法不同的值。