【问题标题】:difference between %fl and %lf in CC 中 %fl 和 %lf 的区别
【发布时间】:2021-12-10 09:09:04
【问题描述】:

我目前正在学习 C 语言数据类型,我尝试在输入“%”后打印编译器建议我使用 fl 的双变量,并且在精度小数行末尾得到 1 个数字。与 %lf 相比,它将总共打印六个精度小数

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

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

【问题讨论】:

  • 你确定最后多出来的1确实是1吗?或者是l
  • %fl 只是 %f 后跟一个文字 l(小写 L),所以输出是 12322.000000l,而不是 12322.0000001
  • 编译器建议我使用 fl 你确定吗?这是一个非常听起来很奇怪的建议,我无法想象编译器为什么会这样做。
  • @SteveSummit 它看起来像这样:ibb.co/w6SytmG
  • 这是哪个 IDE?

标签: c printf double mingw codeblocks


【解决方案1】:

在这次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 转换 说明符适用于 long int 或 unsigned long int 参数;那一个 以下 n 转换说明符适用于指向 long int 的指针 争论;以下 c 转换说明符适用于 wint_t 争论;后面的 s 转换说明符适用于指针 到 wchar_t 参数; 或对后面的 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 类型的对象。

【讨论】:

    【解决方案2】:

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

    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

    【讨论】:

    • 它不是一个整数......但无论如何都要查找规范。
    • 是的,我再次检查它是“l”字母,但不知何故 IDE 为我推荐了“fl”,那么它是什么?
    • @nomeiker:能否请您引用 IDE 提供的完整信息?
    • 我再做一次...首先,我输入“%lf”,但它不匹配。然后当将鼠标悬停在它上面时,会出现一个“fl”以及其他一些东西@987654321 @
    • @nomeiker:那个工具提示似乎一点用都没有。我建议您直接忽略它。
    【解决方案3】:

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

    printf("%f", num);
    

    printf("%lf", num);
    

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

    之所以有相同的效果,是因为printf很特别。 printf 接受可变数量的参数,对于此类函数,C 始终应用 默认参数提升。这意味着所有小于int 的整数类型都被提升为intfloat 被提升为double。所以如果你写

    float f = 1.5;
    printf("%f\n", 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 的建议令人困惑、不必要,而且很可能是错误的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-14
      • 1970-01-01
      • 2018-03-17
      • 1970-01-01
      • 1970-01-01
      • 2013-10-25
      • 1970-01-01
      相关资源
      最近更新 更多