【问题标题】:Wrong output in a c program [duplicate]c程序中的错误输出[重复]
【发布时间】:2014-09-30 10:00:57
【问题描述】:
#include<stdio.h>
int main()
{
int a=1;
printf("%d%d%d",a,++a,a++);

}

为什么输出是 331 而不是 122。

我在互联网上找到的原因是争论是从右到左传递的。首先 a++ 然后 ++a 然后 a 被评估,然后以相反的顺序打印。这个理由对吗。

【问题讨论】:

  • 不告诉我原因
  • 原因 - 未定义的行为
  • @cool guy 但我的书说这与调用约定有关
  • 你的书错了。对此感到抱歉。
  • 阅读作为问题 n.m. 的第二个答案发布的链接。链接到:c-faq.com/expr/seqpoints.html 这是这里唯一有效的答案。

标签: c function calling-convention


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-02
    • 1970-01-01
    • 2017-10-07
    • 2020-10-13
    • 2014-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多