187

为什么读取 a时scanf()需要lin " ",而不管它的参数是 a还是 a ,什么时候可以使用 " " ?%lfdoubleprintf()%fdoublefloat

示例代码:

double d;
scanf("%lf", &d);
printf("%f", d);
4

5 回答 5

216

因为对于采用可变参数的函数,C 会将浮点数提升为双精度数。指针不会被提升为任何东西,因此您应该使用%lf,%lg%le(或%la在 C99 中)来读取双精度数。

于 2008-10-16T23:06:56.217 回答
31

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

  • %f为了float
  • %lf为了double
  • %Lf为了long double

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

但实际上没有理由在实践中这样做。不要使用类型%f的参数。这是在 C89/90 时代诞生的普遍习惯,但它是一个坏习惯。在for中使用并为参数保留保留。printfdouble%lfprintfdouble%ffloat

于 2015-01-29T18:58:50.350 回答
17

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

于 2008-10-16T23:09:12.827 回答
7

因为否则 scanf 会认为您正在传递一个指向比双精度更小的浮点数的指针,并且它将返回不正确的值。

于 2008-10-16T23:10:28.097 回答
3

在 C 表达式中使用 float 或 double 值将导致一个 double 值,因此 printf 无法区分。而指向 double 的指针必须显式地向 scanf 发出信号,与指向 float 的指针不同,因为指针指向的才是最重要的。

于 2008-10-16T23:09:59.157 回答