557

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

代码示例

#include <stdio.h>

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

5 回答 5

727

"%f"是(或至少一种)双精度的正确格式。a 没有格式,因为float如果您尝试将 a 传递floatprintf,它将在收到它double之前被提升为1。在当前标准下也是可以接受的——如果后面跟着转换说明符(等等) ,则被指定为无效。printf"%lf"lf

请注意,这是格式字符串与(和等)格式printf字符串有很大不同的地方。对于输出,您正在传递一个value ,当作为可变参数传递时,它将被提升为to 。对于输入,您传递的是一个未提升的指针,因此您必须告诉您是要阅读 a还是 a ,因此 for ,意味着您要阅读 a并且意味着您要阅读 a (并且,它是什么值得,对于 a ,您使用for或)。scanffscanffloatdoublescanffloatdoublescanf%ffloat%lfdoublelong double%Lfprintfscanf


1. C99,第 6.5.2.2/6 节:“如果表示被调用函数的表达式的类型不包含原型,则对每个参数执行整数提升,并且浮点类型的参数提升为双精度。这些被称为默认参数提升。” 在 C++ 中,措辞有些不同(例如,它不使用“原型”一词),但效果是一样的:所有可变参数在被函数接收之前都经过默认提升。

于 2010-11-24T06:51:00.107 回答
63

给定C99标准(即N1256草案),规则取决于函数类型:fprintf (printf, sprintf, ...) 或 scanf。

以下是提取的相关部分:

前言

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

  • %lf允许的转换说明符printf

7.19.6.1fprintf功能

7长度修饰符及其含义是:

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

L指定后面的 a、A、e、E、f、F、g 或 G 转换说明符适用于 long double 参数。

fprintf为apply forprintfsprintf类似功能指定的相同规则。

7.19.6.2fscanf功能

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 -> 双
  • %Lf-> 长双。

因为fscanf它是:

  • %f -> 浮动
  • %lf-> 双
  • %Lf-> 长双。
于 2012-04-28T23:10:06.023 回答
28

它可以是%f%g或者%e取决于您希望如何格式化数字。有关更多详细信息,请参见此处。在withl中需要修饰符,但在 中不需要。scanfdoubleprintf

于 2010-11-24T06:48:35.597 回答
17

格式%lf是完全正确的printf格式double,与您使用的完全一样。你的代码没有问题。

C 语言的旧(C99 之前)版本不支持格式%lfin ,这在in和. 这种表面上的不一致已在 C99 中得到修复。printfdoubleprintfscanf

您不需要使用%lfwith doublein printf。如果您愿意,您也可以使用%f%lf并且%f在 中等效printf)。但是在现代 C 中,更喜欢使用%fwith float%lfwithdouble%Lfwith long double,在两者中一致地使用printf和是完全合理的scanf

于 2016-05-07T19:52:51.410 回答
11

%Lf(注意大写L)是long doubles的格式说明符。

对于普通doubles的 , %e, %E, %f,%g或者%G会做。

于 2010-11-24T06:49:32.733 回答