(1)What is the difference between %f and %lf in C programming?
For output using the printf
family of functions, the %f
and %lf
specifiers mean the same thing; the l
is ignored. Both require a corresponding argument of type double
— but an argument of type float
is promoted to double
, which is why there’s no separate specifier for type float
. (This promotion applies only to variadic functions like printf
and to functions declared without a prototype, not to function calls in general.) For type long double
, the correct format specifier is %Lf
.
For input using the scanf
family of functions, the floating-point format specifiers are %f
, %lf
, and %Lf
. These require pointers to objects of type float
, double
, and long double
, respectively. (There’s no float
-to-double
promotion because the arguments are pointers. A float
value can be promoted to double
, but a float*
pointer can’t be promoted to a double*
because the pointer has to point to an actual float
object.)
But be careful using the scanf
functions with numeric input. There is no defined overflow checking, and if the input is outside the range of the type your program’s behavior is undefined. For safety, read input into a string and then use something like strtod
to convert it to a numeric value. (See the documentation to find out how to detect errors.)
(2)