我建议像我一样不是很厉害的代码搬运工,看别人代码前先思考思考。
你认为下边的代码的结果是什么?自己再编译器上尝试一下吧
void main()
{
int i = 0;
printf("%d,%d\n", i++, --i);
}
来条毫无瑕疵的分割线
结果是-1,0
这个比较好想,因为,参数从右向左遍历,–i的做法是直接操作i的值,此时i的值为-1;i++的做法是,先将i的值-1保存在一个零时量中,然后在加加。此时i的值从-1变为0,然后将0压栈,再将哪会保存的零时量的值-1压栈。出栈顺序便是打印的值:-1 ,0
还没理解吗?
来个汇编代码,就很好理解了
*mov eax,dword ptr [i]
sub eax,1
mov dword ptr [i],eax*
//上边三行代码为--i操作,直接对i进行操作
mov ecx,dword ptr [i]
mov dword ptr [ebp-0D0h],ecx
//这两行是对i当前的值保存在ebp-0D0h的地址中
mov edx,dword ptr [i]
add edx,1
mov dword ptr [i],edx
//i++后得到0
mov eax,dword ptr [i]
push eax
//0压栈
mov ecx,dword ptr [ebp-0D0h]
push ecx
//-1压栈
push offset string "%d,%d\n" (01B7B30h)
call _printf (01B1352h)
add esp,0Ch
再看一个很有趣的题目:
void main()
{
int i = 0;
printf("%d,%d,%d\n", i++, --i,i++);
}
题目很相似?按照之前的分析,是不是很快得到结果
再来汇编代码
mov eax,dword ptr [i]
mov dword ptr [ebp-0D0h],eax
mov ecx,dword ptr [i]
add ecx,1
mov dword ptr [i],ecx
mov edx,dword ptr [i]
sub edx,1
mov dword ptr [i],edx
mov eax,dword ptr [i]
mov dword ptr [ebp-0D4h],eax
mov ecx,dword ptr [i]
add ecx,1
mov dword ptr [i],ecx
mov edx,dword ptr [ebp-0D0h]
push edx
mov eax,dword ptr [i]
push eax
mov ecx,dword ptr [ebp-0D4h]
push ecx
push offset string "%d,%d,%d\n" (011E7BD4h)
call _printf (011E1352h)
add esp,10h