我目前正在学习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
,因此它最终适用于float
和double
。因此,您不需要l
修饰符来说明哪个。但是这有点令人困惑,所以标准说你可以把l
放在那里,如果你想的话——但你不必这样做,它什么也不做。
(顺便说一下,这与scanf
非常不同,%f
和%lf
完全不同,必须显式匹配float *
类型的参数而不是double *
类型的参数。)
我不知道为什么你的IDE抱怨(在下面画一条红线)%lf
,我也不知道你说的建议是什么意思,
fl, lg, l, f,
elf, Alf, ls, sf,
if, la, lo, of
其中一些看起来可能是非标准的,特定于系统的扩展,但有些(特别是fl
)是无意义的。所以,底线,听起来你的IDE的建议是令人困惑的,不必要的,而且很可能是错误的。