正确的格式说明符是什么 double 在 printf 中?是吗 %f 或者是 %lf?我相信这是 %f, ,但我不确定。

代码示例

#include <stdio.h>

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

解决方案

"%f"为两倍(或至少一个)正确的格式。这里的的无格式的float,因为如果你试图传递一个floatprintf,它会被double接收它 1 前晋升为printf"%lf"也是当前标准下可接受的 - 的l被指定为如果随后f转换说明(等等)为无影响

请注意,这是一个地方,printf格式字符串从scanf(和fscanf等)格式字符串显着不同。对于输出,你传递的的,这将从float当作为可变参数参数传递晋升为double。对于输入你传递一个的指针,你想读一个scanf 的,这是不松口,所以你必须要告诉float是否要读doublescanf,所以对于%ffloat手段你想%lf手段来读取double(并且对于它的价值,对于long double,您使用%Lf对于任何printfscanf)。


<子> 1. C99,§6.5.2.2/ 6:“如果它表示所调用的函数的表达有一个类型不包括一个原型,整数提升上每个参数执行,且具有float类型参数被晋升为一倍。这些被称为默认参数促销活动“。在C ++中的措辞有所不同(例如,它不使用单词“原型”),但效果是一样的:他们是由函数接收之前所有的可变参数的参数进行默认的促销活动。

其他提示

鉴于 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.1 fprintf 功能

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

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

L 指定以下 a、A、e、E、f、F、g 或 G 转换说明符应用于 long double 参数。

指定的相同规则 fprintf 申请 printf, sprintf 和类似的功能。

7.19.6.2 fscanf 功能

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

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

L 指定以下A,A,E,E,F,F,G或G转换指定符适用于带有类型指针的参数。

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

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

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

  • %f -> 双
  • %Lf -> 长双。

并为 fscanf 这是:

  • %f -> 浮动
  • %lf -> 双
  • %Lf -> 长双。

它可以是%f%g%e取决于你希望如何被格式化的数字。见这里了解更多详情。所述l改性剂需要在与scanf double,但不是在printf

printf正确double格式是%lf,完全按照你使用它。有没有错,你的代码。

%lf格式printf不是在C语言,其在doubleprintf创建表面的“不一致”的格式说明之间,用于scanf旧(预C99)版本支持。这肤浅的不一致已被固定在C99。

因此,在现代的C它非常有意义喜欢在两个%ffloat坚持使用与%lf double%Lflong doubleprintfscanf

%Lf (注意大写 L) 是个 格式说明符 为了 长双打.

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

有关双可以简单地使用%lf或者您可以使用以下按您偏好的任何

在指数格式

%e%E为值

%g%G用于正常或指数符号,取其更适合于它的幅度。

了解更多在这里名单用C

的所有格式说明
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top