问题是关于(好的)旧的printf函数。长度子说明符"l"记录在名为"规格"的表中。:
https://www.cplusplus.com/reference/cstdio/printf/
用于解释长度子说明符"l"与说明符"f f e g g a a"的组合的单元格。是空白的。这是否意味着,例如"%le"行为总是像"%e"?"我努力找了一个例子,在这个例子中,我得到了"%le"-输出"one_answers"%e"-输出"之间的区别,但没有成功。这是可能的吗?和"% e"在print -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("%.20en" , d);
printf("%.20len", d);
printf("%.20len", ld);
printf("%.20en" , ld);
return 0;
}
对应的输出如下:
1.12345678912345681155e+00
1.12345678912345681155e+00
1.12345678912345681155e+00
1.12345678912345681155e+00
2018 C标准在条款7.21.6.1,第7段中规定,对于l
:
…对后续的
a
、A
、e
、E
、f
、F
、g
、G
转换指示符没有影响。
(上面省略到"…"的文本指定了l
对其他说明符的影响。)
正如Eric所指出的,长度说明符l
对说明符f F e E g G a A
没有影响。使用长度说明符L
来打印long double
。
请注意,一些编译器(例如MSVC)会将long double
视为double
。
如果编译器支持long double
的更高进动,下面的代码将生成不同的输出:
#include <stdio.h>
int main()
{
double d = 1.123456789123456789123456789;
long double ld = 1.123456789123456789123456789L;
printf("Double: %.20en", d);
printf("Long Double: %.20Len", ld);
printf("Size of double: %lun", sizeof(double));
printf("Size of long double: %lun", sizeof(long double));
}
clang 13.0.0的输出如下:
Double: 1.12345678912345681155e+00
Long Double: 1.12345678912345678911e+00
Size of double: 8
Size of long double: 16