c中%fl和%lf的差异



我目前正在学习C语言的数据类型,我尝试打印一个双变量,编译器建议我在输入'%'后使用fl,我在精确小数行结束时得到了1个数字。与%lf相比,它将打印总共六位精确小数

double num=12322;
printf("%lf",num);// result is 12322.000000
printf("%fl",num);// result is 12322.0000001 

我搜索了很多地方,但大多数情况下,%f和%lf之间的区别是经常被问到的。我的情况可能会一样吗?

printf

printf("%lf",num);// result is 12322.000000

转换说明符%lf中的长度修饰符l不起作用。

选自C标准(7.21.6.1 fprintf函数)

7长度修饰符及其含义为:

l (ell)指定d、i、o、u、x或x之后的转换说明符适用于长整型或无符号长整型参数;,一个下面的转换说明符适用于指向长整型类型的指针参数;下面的c转换说明符适用于wint_t参数;下列转换说明符适用于指针到一个wchar_t参数;or对后面的a, a, e, e,f、f、g或g转换说明符.

printf

printf("%fl",num);// result is 12322.0000001 

在评论中应该写字母'l'而不是你认为的数字1

// result is 12322.000000l
^^^

格式字符串"%fl"表示在根据转换规范%f输出double类型的对象后,将输出字母'l'

注意,对于转换说明符f,可以再使用一个大写字母'L',即'l'。在本例中,转换规范%Lf用于输出类型为long double的对象。

我认为你的输出中实际上有一个打字错误....

double num=12322;
printf("%lf",num);// result is 12322.000000
printf("%fl",num);// result is 12322.0000001

double num=12322;
printf("%lf",num);// result is 12322.000000
printf("%fl",num);// result is 12322.000000l

C标准规定,当传递给可变函数时,float被转换为double,因此%lf%f是等效的;%fl%f是一样的…后面加一个l

有两种正确的方法打印类型为double的值:

printf("%f", num);

printf("%lf", num);

这两个具有完全相同的效果。在这种情况下,"l"修饰符被有效地忽略。

它们具有相同效果的原因是printf是特殊的。printf接受可变数量的参数,对于这样的函数,C总是应用默认参数提升。这意味着所有小于int的整数类型都被提升为int,float被提升为double。所以如果你写

float f = 1.5;
printf("%fn", f);

f在通过之前被提升为double。所以在printf里面,它总是得到一个double。所以%f永远不会看到float,总是double。因此,%f被编写为期望double,因此它最终适用于floatdouble。因此,您不需要l修饰符来说明哪个。但是这有点令人困惑,所以标准说你可以把l放在那里,如果你想的话——但你不必这样做,它什么也不做。

(顺便说一下,这与scanf非常不同,%f%lf完全不同,必须显式匹配float *类型的参数而不是double *类型的参数。)

我不知道为什么你的IDE抱怨(在下面画一条红线)%lf,我也不知道你说的建议是什么意思,

fl, lg, l, f,
elf, Alf, ls, sf,
if, la, lo, of

其中一些看起来可能是非标准的,特定于系统的扩展,但有些(特别是fl)是无意义的。所以,底线,听起来你的IDE的建议是令人困惑的,不必要的,而且很可能是错误的。

相关内容

  • 没有找到相关文章

最新更新