`l`长度修饰符对后续的a,A,e,E,f,F,g或G转换说明符

时间:2015-12-30 11:09:59

标签: c printf language-lawyer c99 format-specifiers

我想了解以下section

  

l (ell)

     

指定以下diouxX转化   说明符适用于longunsigned long参数;那个   以下n转化说明符适用于指向long的指针   参数;以下c转化说明符适用于wint_t   参数;以下s转换说明符适用于指针   到wchar_t参数;或对以下aAeEf没有任何影响,   FgG转换说明符。

我还可以看到这与cppreference:fprintf一致,其中"%f""%lf"printf()系列相同。

this answer是错误的吗?或C99现在明确"%f"float,而"%lf"double来自printf()家庭功能吗?

2 个答案:

答案 0 :(得分:6)

文档是正确的:printffloatdouble之间没有区别。

来自printf系列的函数的参数是通过可变长度机制获得的。在可变长度参数列表的可变长度部分中,“默认参数促销”适用:类型charshort int被提升为intfloat为晋升为double

答案 1 :(得分:2)

TL; DR - 您链接的答案非常好。 %f中的printf()可以处理doublefloat两种类型的参数。

信息: 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