为什么scanf()需要"%lf"用于双打,当printf()只用"%f"时可以吗?

ral*_*ldi 174 c scanf length-modifiers

为什么在阅读时scanf()需要l" %lf" double,何时printf()可以使用" %f",无论其参数是a double还是a float

示例代码:

double d;
scanf("%lf", &d);
printf("%f", d);
Run Code Online (Sandbox Code Playgroud)

MSN*_*MSN 203

因为对于带有可变参数的函数,C会将浮点数提升为双精度数.指针不会被提升为任何东西,所以你应该使用%lf,%lg%le(或%la在C99中)读取双打.


AnT*_*AnT 25

由于С99用C格式说明和浮点参数类型之间的匹配是之间是一致的printfscanf.它是

  • %f 对于 float
  • %lf 对于 double
  • %Lf 对于 long double

恰好,当类型float的参数作为可变参数传递时,这些参数被隐式转换为类型double.这就是为什么在printf格式说明符中%f并且%lf是等效和可互换的原因.在printf可以"交叉使用" %lffloat%fdouble.

但是没有理由在实践中真正做到这一点.请勿使用%fprintf类型的参数double.这是一种普遍的习惯,在C89/90次出生,但这是一个坏习惯.使用%lfprintfdouble,并保持%f预留的float参数.

  • 我会说在 printf 中使用 `%f` 是一个好习惯,因为这样你的代码总是有效的,而如果编译器没有 C99 兼容库,使用 `%lf` 可能会失败。不幸的是,这种情况在现实中确实发生。 (4认同)

Tan*_*lus 16

scanf需要知道所指向的数据的大小&d才能正确填充它,而可变参数函数会将浮点数提升一倍(不完全确定原因),因此printf总是得到一个double.


Jim*_*uck 7

因为否则scanf会认为你传递的指针指向一个小于double的float,它将返回一个不正确的值.