c程序中的输出错误

时间:2014-09-30 10:00:57

标签: c function calling-convention

#include<stdio.h>
int main()
{
int a=1;
printf("%d%d%d",a,++a,a++);

}

这里为什么输出331而不是122.

我在互联网上发现的原因是辩论从右到左传递。首先是++然后++ a然后a得到评估,然后以相反的顺序打印。这是正确的理由。

1 个答案:

答案 0 :(得分:-1)

gcc -S your_source.c解释你的问题

    movl    $1, -4(%rbp)    #, a
    movl    -4(%rbp), %ecx  # a, a.0
    addl    $1, -4(%rbp)    #, a
    addl    $1, -4(%rbp)    #, a
    movl    -4(%rbp), %edx  # a, tmp61
    movl    -4(%rbp), %eax  # a, tmp62
    movl    %eax, %esi      # tmp62,
    movl    $.LC0, %edi     #, offset to "%d%d%d" sttring
    movl    $0, %eax        #,
    call    printf  #

编译器开发人员不能指望有人会试图以这种丑陋的方式使用它

如果你真的需要122:那么改变asm代码如下:

    movl    $1, -4(%rbp)    #, a
    movl    -4(%rbp), %eax  # a, a.0
    addl    $1, -4(%rbp)    #, a
    movl    -4(%rbp), %edx  # a, tmp61
    movl    -4(%rbp), %ecx  # a, tmp62
    movl    %eax, %esi      # tmp62,
    movl    $.LC0, %edi     #,
    movl    $0, %eax        #,
    call    printf  #
    addl    $1, -4(%rbp)    #, a
    leave