Why is it that scanf()
needs the l
in "%lf
" when reading a double
, when printf()
can use "%f
" regardless of whether its argument is a double
or a float
?
Example code:
double d;
scanf("%lf", &d);
printf("%f", d);
Since С99 the matching between format specifiers and floating-point argument types in C is consistent between printf
and scanf
. It is
%f
for float
%lf
for double
%Lf
for long double
It just so happens that when arguments of type float
are passed as variadic parameters, such arguments are implicitly converted to type double
. This is the reason why in printf
format specifiers %f
and %lf
are equivalent and interchangeable. In printf
you can "cross-use" %lf
with float
or %f
with double
.
But there's no reason to actually do it in practice. Don't use %f
to printf
arguments of type double
. It is a widespread habit born back in C89/90 times, but it is a bad habit. Use %lf
in printf
for double
and keep %f
reserved for float
arguments.
Using either a float or a double value in a C expression will result in a value that is a double anyway, so printf can't tell the difference. Whereas a pointer to a double has to be explicitly signalled to scanf as distinct from a pointer to float, because what the pointer points to is what matters.
&
operator, the result of that operation is a pointer to the variable's storage location in memory. It is that pointer which is passed toscanf
. – zwol