我刚刚遇到这个奇怪的场景,我无法解释它。我真的很好奇,最重要的事情发生了什么。 我有这个示例代码:
#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
这是怎么回事?
答案 0 :(得分:4)
将错误的参数类型传递给printf
会导致未定义的行为。当你有未定义的行为时,任何事情都可能发生,包括看似“正确”的行为。
在这种情况下,很可能在此体系结构中,整数和浮点值将传递给不同寄存器中的变量参数函数。因此printf
打印%f
的第一个浮点寄存器和%ld
的第一个整数寄存器,无论它们被传入的顺序如何都会正确。
但是,永远不应该依赖它,甚至可能在这个特定的体系结构上给出错误的结果,具体取决于编译器,优化等。