当我编译并运行以下代码片段时,输出为0.000000。
#include <stdio.h>
int main(void)
{
double a = 1.4;
printf("%lf", a);
return 0;
}
当我编译并运行这段代码时,输出为1.400000,正如我预期的那样是第一个代码段。
#include <stdio.h>
int main(void)
{
double a = 1.4;
printf("%f", a);
return 0;
}
为什么会这样? %lf是双打的格式说明符,所以第一个代码段不应该与第二个代码段具有相同的输出吗?
有人问了一个类似的问题(Correct format specifier for double in printf),但是根据最佳答案,这两个片段应该产生相同的输出“如果后面跟着f转换说明符(等等,则指定l无效) “(引自第一个答案)。
我正在使用代码块作为IDE,并且我使gcc编译器遵循1999年的C标准。可能的重复说我的代码应该按照C99标准工作,我的编译器如下,但我的代码不起作用。因此,副本中的答案并不能解决我的问题。
答案 0 :(得分:1)
引用C11
,章节§7.21.6.1/第7段(强调我的)[和章节§7.19.6.1,C99,如果你有兴趣的话]
长度修饰符及其含义为:
[.....]
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
,{{1}无效}或g
转化 说明符。强>
如果编译器不遵守此规则,则编译器一致性存在问题。
您的代码很好,两个代码段完全相同。