c语言 n=n++ 代码分析

Modified on: Sun, 22 Mar 2020 00:44:27 +0800 热度: 4,031 度

以下是一个思考题,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.

添加新评论