为什么scanf()需要“%lf”作为双打,printf()可以用“%f”吗?
为什么scanf()
在读取double
时需要“ %lf
”中的l
,而printf()
可以使用“ %f
”而不pipe其参数是double
还是float
?
示例代码:
double d; scanf("%lf", &d); printf("%f", d);
因为C将推动漂浮加倍function,采取可变参数。 指针不会升级为任何东西,所以您应该使用%lf
, %lg
或%le
(或C99中的%la
)来读取双精度值。
由于С99在C中的格式说明符和浮点参数types之间的匹配在printf
和scanf
之间是一致的。 它是
-
%f
为float
-
%lf
为double
-
%Lf
long double
恰巧,当float
types的参数作为可变parameter passing时,这样的参数隐式转换为double
types。 这就是为什么在printf
格式说明符中%f
和%lf
是等价和可互换的。 在printf
你可以用float
和%f
交叉使用%lf
和double
。
但是没有理由在实践中真正做到这一点。 不要使用%f
来打印double
types的参数。 C89 / 90时代是一种普遍的习惯,但这是一个坏习惯。 在printf
使用%lf
作为double
并保留%f
为float
参数保留。
scanf
需要知道&d
所指向的数据的大小才能正确填充数据,而variadic函数会将浮点数加倍(不完全确定原因),所以printf
总是会变成double
。
因为否则,scanf会认为你正在传递一个指向浮点数的指针,这个浮点数比double小,它会返回一个不正确的值。
在Cexpression式中使用浮点数或双精度值将导致一个双精度值,所以printf无法区分这个差异。 鉴于指向double的指针必须明确地向scanf发送信号,使其不同于指向float的指针,因为指针指向的是什么。