使用printf函数
Using printf function
当我开始学习没有C的c++时,我从来没有费心去寻找printf。现在我想在一些项目中使用格式化输出。所以我正在寻找一些参考资料,可以解释使用printf和IO流之间的区别。
我的一个疑问是:
float f = 1.5;
printf("%d", f);
为什么打印0 ?它应该把float重新解释为int是真的吗?
它实际上调用未定义行为(UB)。如果格式说明符与传递给printf
的参数的类型不匹配,那么它是UB,这意味着任何事情都可能发生。它可以打印0
或9878978
或任何垃圾。任何完全不可预测的事情都有可能发生。
如果参数的数据类型为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);
- 如何在类成员函数中获得类似printf中的编译警告
- 通过像printf这样的可变参数函数传递一个带有常量字符*转换函数的类
- C++ 如果 Printf 位于函数中,则返回是不同的
- 点在printf函数中是什么意思
- 为什么 printf 函数在以下代码中显示所需的输出
- 在VS2013与VS2017的printf函数中使用宏
- 为什么printf()函数打破了C中的指针adress
- 我可以从函数返回 printf 语句吗?C++
- std::locale::global是否影响printf()函数
- 显示类变量.在 printf 函数中使用字符串作为参数
- 当使用另一个函数封装 printf 和 vfprintf 时,这种差异的原因是什么?
- 为什么printf函数家族关心区域设置
- 错误地将字符串传递给printf样式的日志函数时缺少错误
- 从自定义 printf 函数返回一个常量字符*
- 如何正确地使模板运算符 T() 与 printf 等函数一起使用
- 无法解析 Eclipse C/C 函数'printf'
- printf 函数C++参数化前导零
- 当将数组传递给 printf 等可变参数函数时,我是否应该将数组转换为指针
- printf函数是如何工作的
- printf函数参数之间的序列点;转换之间的顺序点是否重要