以下是一个思考题,n=?
#include <stdio.h>
int main()
{
int n = 10;
n = n++;
printf("%d",n);
return 0;
}
看到这个代码,大部分人可能与我一样,马上出来答案11。可惜,11是错的。
我为了搞懂这么神奇的现象,特地把这段代码生成了汇编代码,结果如下:
subq $16, %rsp
movl $0, -4(%rbp)
movl $10, -8(%rbp)
movl -8(%rbp), %eax ;-8(%rbp)是汇编中的displaced寻址,这里指代变量n的位置,换成c语言格式为:eax=*(int32_t*)(rbp-8)
movl %eax, %ecx
addl $1, %ecx
movl %ecx, -8(%rbp)
movl %eax, -8(%rbp)
movl -8(%rbp), %esi
leaq L_.str(%rip), %rdi
movb $0, %al
callq _printf
以上代码可以看出,先把n变成10,10给了eax,eax给了ecx,ecx+1后ecx变成11,然后ecx给了n,n=11,最后eax再给那个n,eax没有变过,所以导致n的值为10.