代码之家  ›  专栏  ›  技术社区  ›  ByteMe95

错误的printf类型仍在打印正确的值

  •  6
  • ByteMe95  · 技术社区  · 7 年前

    我只是遇到了这种奇怪的情况,我无法解释。我真的很好奇到底发生了什么。 我有以下示例代码:

    #include <stdio.h>
    #include <stdint.h>
    
    int main()
    {
        int64_t qty = 900;
        double  p   = 74.45;
    
        printf( "%f|%ld\n", p, qty );
        printf( "%f|%ld\n", qty, p );
        return 0;
    }
    

    请注意,在第二个printf中,我以错误的顺序提供了参数,更不用说类型错误了。然而,我仍然在这两个方面都得到了正确的输出?这有多奇怪。。。 使用gcc 7.2编译:

    $ ./a.out
    74.450000|900
    74.450000|900
    

    这是怎么回事?

    1 回复  |  直到 7 年前
        1
  •  4
  •   interjay    7 年前

    将错误的参数类型传递给 printf 导致未定义的行为。当您有未定义的行为时,任何事情都可能发生,包括看似“正确”的行为。

    在这种情况下,在这种体系结构上,整数和浮点值很可能传递给不同寄存器中的变量参数函数。所以 打印F 打印的第一个浮点寄存器 %f 和第一个整数寄存器 %ld ,无论传递顺序如何,最终都是正确的。

    然而,这永远不应该被依赖,甚至可能根据编译器、优化等在这个特定体系结构上给出错误的结果。