以下是引用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编辑过]