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

时间:2018-04-19 17:55:48

标签: c printf

我刚刚遇到这个奇怪的场景,我无法解释它。我真的很好奇,最重要的事情发生了什么。 我有这个示例代码:

#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中我提供了错误订单中的参数,更不用说类型错误了。但是,我仍然得到两个CORRECT输出?多奇怪...... 使用gcc 7.2进行编译:

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

这是怎么回事?

1 个答案:

答案 0 :(得分:4)

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

在这种情况下,很可能在此体系结构中,整数和浮点值将传递给不同寄存器中的变量参数函数。因此printf打印%f的第一个浮点寄存器和%ld的第一个整数寄存器,无论它们被传入的顺序如何都会正确。

但是,永远不应该依赖它,甚至可能在这个特定的体系结构上给出错误的结果,具体取决于编译器,优化等。