【发布时间】:2011-10-16 08:24:57
【问题描述】:
当我开始在没有 C 的情况下学习 C++ 时,我从来没有费心寻找 printf。现在我想在某个项目中使用格式化输出。所以我正在寻找一些可以解释使用 printf 和 IO 流之间区别的参考资料。
我的一个疑问是:
float f = 1.5;
printf("%d", f);
为什么打印为零? FWIK 它应该将 float 重新解释为 int 是真的吗?
【问题讨论】:
当我开始在没有 C 的情况下学习 C++ 时,我从来没有费心寻找 printf。现在我想在某个项目中使用格式化输出。所以我正在寻找一些可以解释使用 printf 和 IO 流之间区别的参考资料。
我的一个疑问是:
float f = 1.5;
printf("%d", f);
为什么打印为零? FWIK 它应该将 float 重新解释为 int 是真的吗?
【问题讨论】:
它实际上调用了未定义的行为 (UB)。如果格式说明符与传递给printf 的参数的type 不匹配,则它是UB,这意味着任何事情都可能发生。它可以打印0,或9878978 或任何垃圾。任何完全不可预测的事情都可能发生。
如果参数的数据类型是float,则使用%f。
【讨论】:
当您编写 printf("%d", f); 时,f 的类型必须是 int。您编写的代码会调用未定义的行为。取自an answer to a similar question:
在同样适用于 printf 的 fprintf (7.19.6.1/9) 的文档中,它明确指出,如果任何参数不是格式说明符的正确类型 - 对于未修改的 %d,即 int - 那么行为未定义。
为什么打印为零?
也许他们用完了nasal demons?
【讨论】:
因为%d 用于打印整数, 而不是浮点数。您需要一种浮点格式字符串,例如%f。
数据类型之间的通常转换在这里不起作用,因为printf 是一个可变参数类型的函数,您基本上可以将您想要的任何内容推送到堆栈上(或者如果您的实现不是基于堆栈的,则等效),如果它与您的格式字符串中的内容不匹配,所有赌注都已关闭 - 这是未定义的行为。
请参阅here,了解当您出现此类不匹配时可能出错的事情之一。
【讨论】:
是的,您已经有了答案,%d 将只打印整数值。使用代表浮点值的“%f”。如果你使用%f,你会得到1.500000
【讨论】:
如果您不想使用 %d 格式说明符,那么您最好将其类型转换为 Explicitly 以避免调用 UB(Undefined Behavior)。
浮动 f=1.5; printf("%d",(int)f);
【讨论】: