为什么转换规范%lf对于printf中的Double不起作用
我正在编写一个非常小的代码,只需scanf
和printf
。 我正在读取双倍值并打印它。 转换规范%lf
可以正常读取double值。 但是,它不适用于printf。
当我尝试打印该值时,我得到的输出为0.000000
double fag; scanf("%lf", &fag); printf("%lf", fag);
但是,如果我在printf中使用%f它可以正常工作。
您正在使用的C标准库实现不符合C99(或更新版本)。 前言(第5段)中列出的变化包括:
printf
允许的%lf
转换说明符
l
长度修饰符的描述是( C99 + TC3 7.19.6.1参数7 ,强调我的):
指定以下
d
,i
,o
,u
,x
或X
转换说明符适用于long int
或unsigned long int
参数; 后面的n
转换说明符适用于指向long int argument
的指针; 以下c
转换说明符适用于wint_t
参数; 以下s
转换说明符适用于指向wchar_t
参数的指针; 或对后续的a
,A
,e
,E
,f
,F
,g
或G
转换说明符没有影响。
%f
和%lf
是等价的。 两者都期望一个double
因为与省略号匹配的参数(在int printf(char const * restrict, ...);
的...
int printf(char const * restrict, ...);
)经历了所谓的默认参数提升。 除其他外,它们隐式地将float
转换为double
。 它与scanf()
无关,因为指针不是隐式转换的。
因此,如果您不能或不想更新到较新的C标准库,则可以始终在printf()
格式字符串中使用%f
来打印float
或double
。 但是在scanf()
格式字符串中, %f
需要float*
而%lf
需要double*
。