当 printf ()只需要“% f”时,为什么 Scanf ()需要双精度类型的“% LF”?

为什么 scanf()在读取 double时需要“ %lf”中的 l,而 printf()可以使用“ %f”,而不管它的参数是 double还是 float

示例代码:

double d;
scanf("%lf", &d);
printf("%f", d);
328076 次浏览

因为对于带有变量参数的函数,C 会将浮点数提升为双精度浮点数。指针不会升级为任何值,所以应该使用 %lf%lg%le(或 C99中的 %la)来读取双精度数据。

scanf需要知道 &d指向的数据的大小才能正确地填充它,而可变函数将浮点数提升为双精度数(不完全确定原因) ,所以 printf总是得到 double

在 C 表达式中使用 float 或 double 值将导致一个双精度值,因此 printf 无法区分这两者。而一个指向 double 的指针必须显式地发信号给 Scanf,以区别于指向 float 的指针,因为指针所指向的才是最重要的。

因为如果不这样的话,Scanf 会认为你在传递一个指向浮点数的指针,而浮点数的大小比 double 小,并且它会返回一个不正确的值。

自99年以来,C 语言中格式说明符和浮点参数类型之间的匹配在 printfscanf之间是一致的。是的

  • %f呼叫 float
  • %lf呼叫 double
  • %Lf呼叫 long double

float类型的参数作为可变参数传递时,这些参数被隐式转换为 double类型。这就是为什么在 printf格式说明符 %f%lf是等价的和可互换的原因。在 printf中,你可以“交叉使用”%lffloat,或者 %fdouble

但实际上没有理由这样做。不要对 double类型的 printf参数使用 %f。这是一个普遍的习惯出生在 C89/90次,但它是一个坏习惯。对于 double,在 printf中使用 %lf,并为 float参数保留 %f