【问题标题】:Why doesn't %lf work with doubles in printf but %f does? [duplicate]为什么 %lf 不能在 printf 中使用双打,但 %f 可以? [复制]
【发布时间】:2018-04-07 19:40:22
【问题描述】:

当我编译并运行以下 sn-p 代码时,输​​出为 0.000000。

#include <stdio.h>

int main(void)
{
    double a = 1.4;

    printf("%lf", a);

    return 0;
}

当我编译并运行这段 sn-p 代码时,输​​出为 1.400000,正如我预期的那样,它是用于第一个 sn-p 的。

#include <stdio.h>

int main(void)
{
    double a = 1.4;

    printf("%f", a);

    return 0;
}

为什么会这样? %lf 是双精度的格式说明符,所以第一个 sn-p 不应该与第二个具有相同的输出吗?

有人问了一个类似的问题 (Correct format specifier for double in printf),但根据最重要的答案,两个 sn-ps 应该产生相同的输出,因为“如果后面跟着 f 转换说明符,则 l 被指定为无效(以及其他) "(引自第一个答案)。

我将代码块用作 IDE,并且我使 gcc 编译器遵循 1999 年的 C 标准。 可能的重复项表明我的代码应该按照我的编译器的 C99 标准工作跟随,但我的代码不起作用。因此,重复中的答案并不能解决我的问题。

【问题讨论】:

    标签: c printf double format-specifiers


    【解决方案1】:

    引用 C11,第 7.21.6.1 章/第 7 段(强调我的)[和第 7.19.6.1 章,C99,如果您有兴趣]

    长度修饰符及其含义是:

    [.....]

    l (ell)

    指定以下 diouxX 转换说明符适用于 long intunsigned long int 参数;一个关注n 转换说明符适用于指向 long int 参数的指针;那一个 以下c 转换说明符适用于wint_t 参数;那一个 以下s 转换说明符适用于指向wchar_t 的指针 争论; 或对以下aAeEfFgG 转换没有影响 说明符。

    如果你的编译器不遵守这个,那就是编译器的一致性问题。

    你的代码没问题,两个sn-ps都是一样的。

    See live here

    【讨论】:

    • 这告诉我我的代码没有问题,但这对我很有帮助,但它并没有解决我的问题。我认为这与代码块有关,因为我确实在设置中勾选了一个框以使用符合 c99 标准的编译器。你的答案仍然适用于 C99 标准,对吧?
    • @programmer5934 绝对。 §7.19.6.1, C99,如果你有兴趣的话。
    • @programmer5934 为了完整性,唯一允许l的标准是最旧的,C89/C90。
    猜你喜欢
    • 2010-09-17
    • 1970-01-01
    • 2013-03-14
    • 1970-01-01
    • 2021-08-12
    • 1970-01-01
    • 2015-11-28
    • 1970-01-01
    相关资源
    最近更新 更多