为什么 %lf 不能在 printf 中使用双打但 %f 可以?
Why doesn't %lf work with doubles in printf but %f does?
当我编译 运行 下面的代码片段时,输出是 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),但根据最上面的答案,这两个片段应该产生与 "the l is specified as having no effect if followed by the f conversion specifier (among others)" 相同的输出(引用自第一个答案)。
我将代码块用作 IDE 并且我使 gcc 编译器遵循 1999 年的 C 标准。 可能的重复说明我的代码应该可以工作根据我的编译器遵循的 C99 标准,但我的代码不起作用。因此,重复的答案不能解决我的问题。
引用 C11
,第 §7.21.6.1 章/第 7 段(强调我的)[和第 §7.19.6.1 章,C99,如果您有兴趣]
The length modifiers and their meanings are:
[.....]
l (ell)
Specifies that a following d
, i
, o
, u
, x
, or X
conversion specifier applies to a
long int
or unsigned long int
argument; that a following n
conversion specifier applies to a pointer to a long int
argument; that a
following c
conversion specifier applies to a wint_t
argument; that a
following s
conversion specifier applies to a pointer to a wchar_t
argument; or has no effect on a following a
, A
, e
, E
, f
, F
, g
, or G
conversion
specifier.
如果你的编译器不遵守这一点,那就是编译器一致性问题。
您的代码很好,两个代码段完全相同。
当我编译 运行 下面的代码片段时,输出是 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),但根据最上面的答案,这两个片段应该产生与 "the l is specified as having no effect if followed by the f conversion specifier (among others)" 相同的输出(引用自第一个答案)。
我将代码块用作 IDE 并且我使 gcc 编译器遵循 1999 年的 C 标准。 可能的重复说明我的代码应该可以工作根据我的编译器遵循的 C99 标准,但我的代码不起作用。因此,重复的答案不能解决我的问题。
引用 C11
,第 §7.21.6.1 章/第 7 段(强调我的)[和第 §7.19.6.1 章,C99,如果您有兴趣]
The length modifiers and their meanings are:
[.....]
l (ell)
Specifies that a following
d
,i
,o
,u
,x
, orX
conversion specifier applies to along int
orunsigned long int
argument; that a followingn
conversion specifier applies to a pointer to along int
argument; that a followingc
conversion specifier applies to awint_t
argument; that a followings
conversion specifier applies to a pointer to awchar_t
argument; or has no effect on a followinga
,A
,e
,E
,f
,F
,g
, orG
conversion specifier.
如果你的编译器不遵守这一点,那就是编译器一致性问题。
您的代码很好,两个代码段完全相同。