c -长度子说明符"l"在(好的)旧printf上下文中有任何影响吗?



问题是关于(好的)旧的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:

…对后续的aAeEfFgG转换指示符没有影响。

(上面省略到"…"的文本指定了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

相关内容

  • 没有找到相关文章

最新更新