Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c程序中的错误输出 #包括 int main() { INTA=1; printf(“%d%d%d”,a,++a,a++); }_C_Function_Calling Convention - Fatal编程技术网

c程序中的错误输出 #包括 int main() { INTA=1; printf(“%d%d%d”,a,++a,a++); }

c程序中的错误输出 #包括 int main() { INTA=1; printf(“%d%d%d”,a,++a,a++); },c,function,calling-convention,C,Function,Calling Convention,这里为什么是输出331而不是122 我在互联网上发现的原因是争论是从右向左传递的。首先对a++进行计算,然后对a++进行计算,然后按相反的顺序打印。这是正确的原因吗。gcc-S你的来源。c解释你的问题 #include<stdio.h> int main() { int a=1; printf("%d%d%d",a,++a,a++); } 编译器开发人员不能期望有人会以如此丑陋的方式使用它 如果您确实需要122:则按如下所示更改asm代码: movl $1, -4(

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


我在互联网上发现的原因是争论是从右向左传递的。首先对a++进行计算,然后对a++进行计算,然后按相反的顺序打印。这是正确的原因吗。

gcc-S你的来源。c解释你的问题

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

}
编译器开发人员不能期望有人会以如此丑陋的方式使用它

如果您确实需要122:则按如下所示更改asm代码:

    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  #

不,告诉我原因-未定义的行为@cool guy,但我的书说这与称之为约定有关你的书错了。很抱歉。请阅读作为问题第二个答案发布的链接n.m.链接到:这是这里唯一有效的答案。
    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