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

我正在编写一个非常小的代码,只需scanfprintf 。 我正在读取双倍值并打印它。 转换规范%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 ,强调我的):

指定以下diouxX转换说明符适用于long intunsigned long int参数; 后面的n转换说明符适用于指向long int argument的指针; 以下c转换说明符适用于wint_t参数; 以下s转换说明符适用于指向wchar_t参数的指针; 或对后续的aAeEfFgG转换说明符没有影响。

%f%lf是等价的。 两者都期望一个double因为与省略号匹配的参数(在int printf(char const * restrict, ...);... int printf(char const * restrict, ...); )经历了所谓的默认参数提升。 除其他外,它们隐式地将float转换为double 。 它与scanf()无关,因为指针不是隐式转换的。

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