printf中 double 的格式说明符是什么?是 %f 还是 %lf ?我相信它是 %f ,但我不确定 .
double
%f
%lf
#include <stdio.h> int main() { double d = 1.4; printf("%lf", d); // Is this wrong? }
"%f" 是double的(或至少一种)正确格式 . float 没有格式,因为如果您尝试将 float 传递给 printf ,它将在 printf 收到它之前被提升为 double . "%lf" 在当前标准下也是可接受的 - 如果后跟 f 转换说明符(等等), l 被指定为无效 .
"%f"
float
printf
"%lf"
f
l
请注意,这是 printf 格式字符串与 scanf (和 fscanf 等)格式字符串显着不同的地方 . 对于输出,您传递一个值,当作为可变参数传递时,该值将从 float 提升为 double . 对于输入,你传递的指针是未提升的,所以你必须告诉 scanf 你是否要读 float 或 double ,所以对于 scanf , %f 表示你想要读 float 和 %lf 表示你想读a double (并且,对于 long double 的值,对于 printf 或 scanf ,使用 %Lf ) .
scanf
fscanf
long double
%Lf
鉴于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年 . 上一版本的主要更改包括:printf中允许的%lf转换说明符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 指定的相同规则适用于 printf , sprintf 和类似功能 .
fprintf
sprintf
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 - >双倍
%Lf - >长双 .
对于 fscanf 它是:
%f - >浮动
%lf - >双倍
%Lf (注意大写 L )是format specifier for long doubles .
L
对于普通 doubles , %e , %E , %f , %g 或 %G 都可以 .
doubles
%e
%E
%g
%G
对于双倍,你可以简单地使用 %lf ,或者你可以根据自己的喜好使用以下任何一种
%e 或 %E 表示指数格式的值
%g 或 %G 表示正常或指数表示法,以其大小为准 .
在这里阅读更多List of all Format Specifier in C
double 的正确 printf 格式为 %lf ,与您使用的完全相同 . 您的代码没有任何问题 .
C语言的旧(C99之前)版本不支持 printf 中的格式 %lf ,这在 printf 和 scanf 中为 double 的格式说明符之间创建了表面"inconsistency" . 表面上的不一致已在C99中修复 .
所以在现代C中,在 printf 和 scanf 中使用 %f 与 float , %lf 与 double 和 %Lf 与 long double 一致地使用是非常有意义的 .
它可以是 %f , %g 或 %e ,具体取决于您希望如何格式化数字 . 有关详细信息,请参阅here . l 修饰符在 scanf 中需要 double ,但不在 printf 中 .
6 回答
"%f"
是double的(或至少一种)正确格式 .float
没有格式,因为如果您尝试将float
传递给printf
,它将在printf
收到它之前被提升为double
."%lf"
在当前标准下也是可接受的 - 如果后跟f
转换说明符(等等),l
被指定为无效 .请注意,这是
printf
格式字符串与scanf
(和fscanf
等)格式字符串显着不同的地方 . 对于输出,您传递一个值,当作为可变参数传递时,该值将从float
提升为double
. 对于输入,你传递的指针是未提升的,所以你必须告诉scanf
你是否要读float
或double
,所以对于scanf
,%f
表示你想要读float
和%lf
表示你想读adouble
(并且,对于long double
的值,对于printf
或scanf
,使用%Lf
) .鉴于C99标准(即N1256草案),规则取决于函数类型:fprintf(printf,sprintf,...)或scanf .
以下是相关部分的提取:
为
fprintf
指定的相同规则适用于printf
,sprintf
和类似功能 .长话短说,对于
fprintf
,指定了以下说明符和相应的类型:%f
- >双倍%Lf
- >长双 .对于
fscanf
它是:%f
- >浮动%lf
- >双倍%Lf
- >长双 .%Lf
(注意大写L
)是format specifier for long doubles .对于普通
doubles
,%e
,%E
,%f
,%g
或%G
都可以 .对于双倍,你可以简单地使用
%lf
,或者你可以根据自己的喜好使用以下任何一种%e
或%E
表示指数格式的值%g
或%G
表示正常或指数表示法,以其大小为准 .在这里阅读更多List of all Format Specifier in C
double
的正确printf
格式为%lf
,与您使用的完全相同 . 您的代码没有任何问题 .C语言的旧(C99之前)版本不支持
printf
中的格式%lf
,这在printf
和scanf
中为double
的格式说明符之间创建了表面"inconsistency" . 表面上的不一致已在C99中修复 .所以在现代C中,在
printf
和scanf
中使用%f
与float
,%lf
与double
和%Lf
与long double
一致地使用是非常有意义的 .它可以是
%f
,%g
或%e
,具体取决于您希望如何格式化数字 . 有关详细信息,请参阅here .l
修饰符在scanf
中需要double
,但不在printf
中 .