以下是引用kevin_c在2016-5-13 19:14:35的发言:
如:
int a = 1;
a=a++;
为什么a的值是1,而不是2;
我觉得应该是a的值先赋给a,然后a再自增1,所以输出a的时候应该是2才对呀
从编译代码看比较好理解
如:
#include <stdio.h>
main()
{
int a=1;
a=a++;
printf("%d", a);
}
编译代码:
注释:
MOV DWORD PTR SS:[ESP+1C],1 ; int a=1
MOV EAX,DWORD PTR SS:[ESP+1C] ; EAX = a
LEA EDX,DWORD PTR DS:[EAX+1] ; EDX = EAX+1
MOV DWORD PTR SS:[ESP+1C],EDX ; a = EDX (a=2)
MOV DWORD PTR SS:[ESP+1C],EAX ; a = EAX (a=1)
MOV EAX,DWORD PTR SS:[ESP+1C] ; EAX = a
MOV DWORD PTR SS:[ESP+4],EAX ; a,printf()第2个参数
MOV DWORD PTR SS:[ESP],_Test.00404000 ; ASCII "%d",printf()第1个参数
CALL <JMP.&msvcrt.printf> ; 执行 printf("%d", a)
MOV EAX,0 ; 返回 0
LEAVE
RETN
关键在这里:
MOV DWORD PTR SS:[ESP+1C],EDX ; a = EDX (a=2)
MOV DWORD PTR SS:[ESP+1C],EAX ; a = EAX (a=1)
a++之后又还原了。
[此贴子已经被作者于2016-5-15 09:01编辑过]