printf 中 double 的正确格式说明符
-
27-09-2019 - |
题
正确的格式说明符是什么 double
在 printf 中?是吗 %f
或者是 %lf
?我相信这是 %f
, ,但我不确定。
代码示例
#include <stdio.h>
int main()
{
double d = 1.4;
printf("%lf", d); // Is this wrong?
}
解决方案
"%f"
为两倍(或至少一个)正确的格式。这里的为的无格式的float
,因为如果你试图传递一个float
到printf
,它会被double
接收它 1 前晋升为printf
。 "%lf"
也是当前标准下可接受的 - 的l
被指定为如果随后f
转换说明(等等)为无影响
请注意,这是一个地方,printf
格式字符串从scanf
(和fscanf
等)格式字符串显着不同。对于输出,你传递的值的,这将从float
当作为可变参数参数传递晋升为double
。对于输入你传递一个的指针,你想读一个scanf
的,这是不松口,所以你必须要告诉float
是否要读double
或scanf
,所以对于%f
,float
手段你想%lf
手段来读取double
(并且对于它的价值,对于long double
,您使用%Lf
对于任何printf
或scanf
)。
<子> 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语言,其在double
和printf
创建表面的“不一致”的格式说明之间,用于scanf
旧(预C99)版本支持。这肤浅的不一致已被固定在C99。
因此,在现代的C它非常有意义喜欢在两个%f
和float
坚持使用与%lf
double
,%Lf
与long double
和printf
与scanf
。