为什么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 -
%Lflong double
恰巧,当floattypes的参数作为可变parameter passing时,这样的参数隐式转换为doubletypes。 这就是为什么在printf格式说明符中%f和%lf是等价和可互换的。 在printf你可以用float和%f交叉使用%lf和double 。
但是没有理由在实践中真正做到这一点。 不要使用%f来打印doubletypes的参数。 C89 / 90时代是一种普遍的习惯,但这是一个坏习惯。 在printf使用%lf作为double并保留%f为float参数保留。
scanf需要知道&d所指向的数据的大小才能正确填充数据,而variadic函数会将浮点数加倍(不完全确定原因),所以printf总是会变成double 。
因为否则,scanf会认为你正在传递一个指向浮点数的指针,这个浮点数比double小,它会返回一个不正确的值。
在Cexpression式中使用浮点数或双精度值将导致一个双精度值,所以printf无法区分这个差异。 鉴于指向double的指针必须明确地向scanf发送信号,使其不同于指向float的指针,因为指针指向的是什么。