首页 > 解决方案 > 在(好的)旧 printf 的上下文中,长度子说明符“l”有什么影响吗?

问题描述

问题是关于(好的)旧 printf 函数。长度子说明符“l”记录在名为“说明符”的表中:

https://www.cplusplus.com/reference/cstdio/printf/

用于解释长度子说明符“l”与说明符“f F e E g G a A”组合的单元格是空白的。这是否意味着,例如“%le”的行为总是像“%e”?我努力寻找一个例子,我在“%le”输出和“%e”输出之间得到了区别……但没有任何成功。会不会是“%le”和“%e”在 printf-context 中产生了大致相同的输出?我正在使用 Visual Studio 版本 16.11.5 和 MSC 版本 19.29.30136(MSC_FULL_VER 是“192930136”)。这是我的代码:

#include <iostream>

//to get the MSC-compiler version
#define XSTR(x) STR(x)
#define STR(x) #x
#pragma message("_MSC_FULL_VER:")
#pragma message(XSTR(_MSC_FULL_VER))

int main()
{
    double d = 1.123456789123456789123456789;
    long double ld = static_cast<long double>(d);

    printf("%.20e\n" , d);
    printf("%.20le\n", d);
    printf("%.20le\n", ld);
    printf("%.20e\n" , ld);

    return 0;
}

这是相应的输出:

1.12345678912345681155e+00
1.12345678912345681155e+00
1.12345678912345681155e+00
1.12345678912345681155e+00

标签: cprintf

解决方案


2018 C 标准在第 7.21.6.1 条第 7 段中规定l

… 对后面a的 , A, e, E, f, F, g, 或G转换说明符没有影响。

(省略了上面使用的“...”的文本指定了l对其他说明符的影响。)


推荐阅读