float的访问说明符不符合预期

Siv*_*een -3 floating-point

#include <stdio.h>
int main()
{
    printf("%f",5);
}
Run Code Online (Sandbox Code Playgroud)

此代码打印0.000000.任何人都可以解释为什么会这样.

Pas*_*uoq 5

%f格式要求一个double说法,你是路过的int.这是未定义的行为,任何事情都可能发生.你很幸运,发生的事情只是打印0.00000.

在C中,可变参数函数不知道在调用站点传递给它们的参数的类型.在这种情况下printf,他们只能信任格式字符串来提供该信息.如果参数的类型与(在编译时已知)格式字符串不匹配,任何好的编译器都应该发出警告,我很惊讶你的没有.函数的实现可以依赖于已经应用的默认参数促销,但这就是全部.

在实践中,两种常见的情况是参数在堆栈上传递,在这种情况下,在调用站点推送的int5将被解释为64位double,或者参数通过寄存器传递,在这种情况下printf函数将获得一个double从没有设置在调用点,并包含取其值留下它使用了有最后一次浮点寄存器的值.