为什么转换规范%lf对于printf中的Double不起作用

Din*_*rma 0 c format-specifiers

我只是写一个非常小的代码scanfprintf。我正在读取一个双精度值并将其打印出来。转换规范%lf可以正常工作以读取双精度值。但是,它不适用于printf。

当我尝试打印该值时,我得到的输出像 0.000000

double fag;
scanf("%lf", &fag);
printf("%lf", fag);
Run Code Online (Sandbox Code Playgroud)

但是,如果我在printf中使用%f,它可以正常工作。

cre*_*mno 5

您使用的C标准库实现不符合C99(或更高版本)。前言(第5段)中列出的更改包括:

%lf 允许使用转换说明符 printf

l长度修饰符的描述为(C99 + TC3 7.19.6.1参数7,重点是):

用于指定后续的dioux,或X转换说明适用于一个long intunsigned long int参数; 以下n转换说明符适用于指向的指针long int argument;以下c转换说明符适用于一个wint_t参数;以下s转换说明符适用于指向wchar_t参数的指针;或具有在以下没有影响aAeEfFg,或G转换说明。

%f%lf因此等效。两者都期望double因为与省略号(...in int printf(char const * restrict, ...);)匹配的参数会经历所谓的默认参数提升。除其他外,它们隐式转换floatdouble。没关系,scanf()因为不会隐式转换指针。

因此,如果您不能或不希望更新到较新的C标准库,则%f可以始终使用printf()格式字符串来打印floatdouble。但是在scanf()格式字符串中,%fexpects float*%lfexpected double*