我想了解以下section:
l (ell)
指定以下
d
,i
,o
,u
,x
或X
转化 说明符适用于long
或unsigned long
参数;那个 以下n
转化说明符适用于指向long
的指针 参数;以下c
转化说明符适用于wint_t
参数;以下s
转换说明符适用于指针 到wchar_t
参数;或对以下a
,A
,e
,E
,f
没有任何影响,F
,g
或G
转换说明符。
我还可以看到这与cppreference:fprintf一致,其中"%f"
和"%lf"
与printf()
系列相同。
this answer是错误的吗?或C99
现在明确"%f"
是float
,而"%lf"
是double
来自printf()
家庭功能吗?
答案 0 :(得分:6)
文档是正确的:printf
在float
和double
之间没有区别。
来自printf
系列的函数的参数是通过可变长度机制获得的。在可变长度参数列表的可变长度部分中,“默认参数促销”适用:类型char
和short int
被提升为int
,float
为晋升为double
。
答案 1 :(得分:2)
TL; DR - 您链接的答案非常好。 %f
中的printf()
可以处理double
和float
两种类型的参数。
信息: printf()
是variadic function。
根据C99
,第7.19.6.3章
#include <stdio.h>
int printf(const char * restrict format, ...);
关于%f
格式说明符,
f,F
表示浮点数的
double
参数将转换为 样式 [ - ] ddd.ddd 中的十进制表示法,其中的位数 小数点字符等于精度规格。 [....]
因此,我们看到,标准仅提及double
。对其年轻人,float
感到好奇吗?
然后,从章节§6.5.2.2,第7段
[...]函数原型声明符中的省略号表示法导致 参数类型转换在最后声明的参数后停止。默认参数 促销是在尾随参数上进行的。
并且,关于默认参数促销部分,(强调我的),第6段,
[...]如果表示被调用函数的表达式具有不包含a的类型 原型,对每个参数执行整数提升,和参数 将类型
float
提升为double
。这些被称为默认参数 促销活动。 [...]
因此,对于printf()
函数,使用%f
格式说明符,提供的参数是float
还是double
类型无关紧要,它将被提升为无论如何double
。