printf中double的正确格式说明符是什么?是%f还是%lf?我相信是%f,但我不确定。
double
%f
%lf
#include <stdio.h> int main() { double d = 1.4; printf("%lf", d); // Is this wrong? }
它可以是%f, %g或%e,这取决于你想要的数字格式。详见在这里。在scanf和double中需要l修饰符,但在printf中不需要。
%g
%e
scanf
l
printf
%Lf(注意大写的L)是长双打的格式说明符。
%Lf
L
对于普通的doubles,或者%e, %E, %f, %g或%G都可以。
doubles
%E
%G
"%f"是(或至少一个)double类型的正确格式。float没有格式,因为如果你试图将float传递给printf,它会在printf接收到float0之前被提升到double。"%lf"在当前标准下也是可以接受的——如果后面跟着f转换说明符,则l被指定为无效。
"%f"
float
"%lf"
f
请注意,这是printf格式字符串与scanf(和fscanf等)格式字符串有本质区别的地方。对于输出,您传递的是scanf7,当作为可变参数传递时,它将从float提升到double。对于输入,你传递了一个scanf8,这是不提升的,所以你必须告诉scanf你是否想读一个float或double,所以对于scanf, %f意味着你想读一个float和scanf1意味着你想读一个double(并且,为了它的价值,对于scanf3,你使用scanf4为printf或scanf)。
fscanf
以下是相关部分摘录:
前言 本第二版取消并取代了由ISO/IEC 9899/COR1:1994、ISO/IEC 9899/AMD1:1995和ISO/IEC 9899/COR2:1996修订和修正的第一版ISO/IEC 9899:1990。 与前一版本相比的主要变化包括: printf中允许的%lf转换说明符 7.19.6.1 fprintf函数 长度修饰符及其含义是: l (ell)指定(…)对后面的a, a, e, e, f, f, g或g转换说明符没有影响。 l指定a, a, e, e, f, f, g或g后面的转换说明符应用于长双精度实参。
前言
7.19.6.1 fprintf函数
fprintf
长度修饰符及其含义是:
l (ell)指定(…)对后面的a, a, e, e, f, f, g或g转换说明符没有影响。
l指定a, a, e, e, f, f, g或g后面的转换说明符应用于长双精度实参。
为fprintf指定的规则同样适用于printf、sprintf和类似的函数。
sprintf
7.19.6.2 fscanf函数 长度修饰符及其含义是: l (ell)指定(…)a, a, e, e, f, f, g或g转换说明符后面的a应用于类型指针指向double的实参; l指定a, a, e, e, f, f, g或g转换后的a 说明符应用于类型指针指向长double的实参 转换说明符及其含义是: a,e,f,g匹配一个有符号浮点数,(…) 转换说明符A、E、F、G和X也是有效的,它们的行为分别与A、E、F、G和X相同。
7.19.6.2 fscanf函数
l (ell)指定(…)a, a, e, e, f, f, g或g转换说明符后面的a应用于类型指针指向double的实参;
l指定a, a, e, e, f, f, g或g转换后的a 说明符应用于类型指针指向长double的实参 转换说明符及其含义是: a,e,f,g匹配一个有符号浮点数,(…)
转换说明符A、E、F、G和X也是有效的,它们的行为分别与A、E、F、G和X相同。
长话短说,对于fprintf,指定了以下说明符和相应的类型:
对于fscanf,它是:
格式%lf是一个完全正确的printf格式的double,完全像你使用它。你的代码没有问题。
旧版本(c99之前)的C语言不支持printf中的%lf格式,这在printf中的double和scanf的格式说明符之间造成了表面上的“不一致”。这种表面上的不一致在C99中得到了修复。
您不需要在printf中使用%lf和double。如果你喜欢的话,你也可以使用%f (%lf和%f在printf中是等价的)。但在现代C语言中,更喜欢使用%f和float, %lf和double, double1和double2,在printf和double4中都是一致的,这是完全有意义的。