为什么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之间的匹配在printfscanf之间是一致的。 它是

  • %ffloat
  • %lfdouble
  • %Lf long double

恰巧,当floattypes的参数作为可变parameter passing时,这样的参数隐式转换为doubletypes。 这就是为什么在printf格式说明符中%f%lf是等价和可互换的。 在printf你可以用float%f交叉使用%lfdouble

但是没有理由在实践中真正做到这一点。 不要使用%f来打印doubletypes的参数。 C89 / 90时代是一种普遍的习惯,但这是一个坏习惯。 在printf使用%lf作为double并保留%ffloat参数保留。

scanf需要知道&d所指向的数据的大小才能正确填充数据,而variadic函数会将浮点数加倍(不完全确定原因),所以printf总是会变成double

因为否则,scanf会认为你正在传递一个指向浮点数的指针,这个浮点数比double小,它会返回一个不正确的值。

在Cexpression式中使用浮点数或双精度值将导致一个双精度值,所以printf无法区分这个差异。 鉴于指向double的指针必须明确地向scanf发送信号,使其不同于指向float的指针,因为指针指向的是什么。

Interesting Posts