提问



printf中double的正确格式说明符是什么?是%f还是%lf?我相信它%f,但我不确定。


代码示例



#include 

int main()
{
   double d = 1.4;
   printf("%lf", d); // Is this wrong?
}

最佳参考


"%f"是双精度的(或至少一个)正确格式。 没有float的格式,因为如果你试图将float传递给printf,它将被提升为double之前printf收到它 1 "%lf"在现行标准下也是可以接受的 - l被指定为无效后如果f转换说明符(以及其他)。


请注意,这是printf格式字符串与scanf(和fscanf等)格式字符串大不相同的地方。对于输出,你传递一个值,当作为一个变量参数传递时,它会从float升级到double。对于输入你要传递一个指针,没有提升,所以你必须告诉scanf你是否想要读floatdouble,所以对于scanf%f意味着你想要阅读float%lf意味着你想要阅读double(并且,对于它的价值,对于long double,你将%Lf用于printfscanf)。





<子>
1. C99,§6.5.2.2/6:如果表示被调用函数的表达式具有不包含原型的类型,则对每个参数执行整数提升,并将具有float类型的参数提升为double。这些被称为默认参数促销。在C ++中,措辞有些不同(例如,它没有使用原型这个词)但效果是相同的:所有可变参数在它们被函数接收之前经历默认促销。


其它参考1


鉴于C99标准(即 N1256 草案),规则取决于
功能类型:fprintf(printf,sprintf,...)或scanf。[82]


以下是相关部分的提取:



??的前言

??
??第二版取消并取代了ISO/IEC 9899/COR1:1994,ISO/IEC 9899/AMD1:1995和ISO/IEC 9899/COR2:1996修订和更正的第一版ISO/IEC 9899:1990。
??上一版的主要变化包括:

??
??

    ??[[li> %lf printf 中允许的转换说明符
    ??

??
?? 7.19.6.1 fprintf函数

??
?? 7 长度修饰符及其含义为:

??
?? l (ell)指定(...)对后续的a,A,e,E,f,F,g或G转换说明符没有影响。

??
?? L 指定跟随a,A,e,E,f,F,g或G转换说明符适用于long double参数。



fprintf规定的相同规则适用于printfsprintf和类似的功能。



?? 7.19.6.2 fscanf函数

??
?? 11 长度修饰符及其含义为:

??
?? l (ell)指定(...)后面的a,A,e,E,f,F,g或G转换说明符适用于类型指针为double的参数;

??
?? L 指定跟随a,A,e,E,f,F,g或G转换
??说明符适用于带有long double类型指针的参数。

??
?? 12 转换说明符及其含义为:
???????a,e,f,g匹配可选的带符号浮点数,(...)

??
?? 14 转换说明符A,E,F,G和X也有效,其行为分别与a,e,f,g和x相同。



长话短说,fprintf指定了以下说明符和相应的类型:



  • %f - > double

  • %Lf - > long double。



fscanf则是:



  • %f - > float

  • %lf - > double

  • %Lf - > long double。


其它参考2


它可以是%f%g%e,具体取决于您希望如何格式化数字。有关详细信息,请参见此处l中的l修饰符在double中是必需的,但在printf中则不需要。[83]

其它参考3


double的正确printf格式为%lf,与您使用的格式完全相同。您的代码没有任何问题。


C语言的旧(C99之前)版本不支持printf中的格式%lf,这在printfprintf double的格式说明符之间产生了表面不一致。 scanf。表面上的不一致已在C99中修复。


因此,在现代C中,优先使用%ffloat%lfdouble%Lflong double一致地使用%f是完全合理的。 printfscanf

其它参考4


%Lf(注意大写L)是长双打的格式说明符。[84] [85]


对于普通doubles%e%E%f%g%G都可以。

其它参考5


对于双倍,你可以简单地使用%lf,或者你可以根据自己的喜好使用以下任何一种


%e%E表示指数格式的值


%g%G表示正常或指数表示法,以较大者为准。


在这里阅读更多C [86]中所有格式说明符的列表