Why Conversion Specification %lf does not work for Double in printf

穿精又带淫゛_ 提交于 2019-11-29 23:59:40

问题


I am writing a very small code just scanf and printf. I am reading a double value and printing it. The conversion specification %lf works properly to read a double value. But, it doesn't work with printf.

When I am trying to print that value I am getting output like 0.000000

double fag;
scanf("%lf", &fag);
printf("%lf", fag);

But, if I use %f in printf it works properly.


回答1:


The C standard library implementation you're using doesn't conform to C99 (or newer). The changes listed in the foreword (paragraph 5) contain:

%lf conversion specifier allowed in printf

The description of the l length modifier is (C99+TC3 7.19.6.1 par. 7, emphasis mine):

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.

%f and %lf are therefore equivalent. Both expect a double because arguments matching the ellipsis (the ... in int printf(char const * restrict, ...);) undergo the so-called default argument promotions. Among other things they implicitly convert float to double. It doesn't matter for scanf() since pointers aren't implicitly converted.

So if you can't or don't want to update to a newer C standard library %f can always be used in a printf() format string to print float or double. However in scanf() format strings %f expects float* and %lf expects double*.



来源:https://stackoverflow.com/questions/31600931/why-conversion-specification-lf-does-not-work-for-double-in-printf

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!