使用printf函数

Using printf function

本文关键字:函数 printf 使用      更新时间:2023-10-16

当我开始学习没有C的c++时,我从来没有费心去寻找printf。现在我想在一些项目中使用格式化输出。所以我正在寻找一些参考资料,可以解释使用printf和IO流之间的区别。

我的一个疑问是:

float f = 1.5;
printf("%d", f);

为什么打印0 ?它应该把float重新解释为int是真的吗?

它实际上调用未定义行为(UB)。如果格式说明符与传递给printf的参数的类型不匹配,那么它是UB,这意味着任何事情都可能发生。它可以打印09878978或任何垃圾。任何完全不可预测的事情都有可能发生。

如果参数的数据类型为float,则使用%f

当你写printf("%d", f);时,f的类型必须是int。您所编写的代码将调用未定义行为。摘自对类似问题的回答:

在fprintf(7.19.6.1/9)的文档中也适用于printf,它显式地声明如果任何参数不是格式说明符的正确类型-对于未修改的%d,即int -则不定义行为。


为什么打印0 ?

也许他们没有鼻魔了?

因为%d是用于打印整数,不是浮点数。您需要一个浮点格式字符串,如%f

通常的数据类型之间的转换在这里不起作用,因为printf是一个varargs类型的函数,你基本上可以把任何你想要的东西推到堆栈上(或者等效的,如果你的实现不是基于堆栈的),如果它不匹配你的格式字符串,所有的下注都是不确定的行为。

请看这里,当你有这样的不匹配时,可能会出错的事情之一。

是的,你已经有答案了,%d将只打印整数值。使用"%f",它代表浮点值。如果你使用%f,你会得到1.500000

如果您不想使用%d格式说明符,那么您最好显式地对其进行类型转换,以避免调用UB(未定义行为)。

浮动f = 1.5;printf (" % d"(int) f);