为什么 scanf() 需要“%lf”来表示双精度数,而 printf() 只需“%f”就可以了?

StackOverflow https://stackoverflow.com/questions/210590

  •  03-07-2019
  •  | 
  •  

为什么会这样 scanf() 需要 l 在 ”%lf“当读一个 double, , 什么时候 printf() 可以使用 ”%f“无论它的参数是否是 double 或一个 float?

示例代码:

double d;
scanf("%lf", &d);
printf("%f", d);
有帮助吗?

解决方案

因为对于带有可变参数的函数,C会将浮点数提升为双精度数。指针不会被提升为任何内容,因此您应该使用%lf %lg %le (或%la 中的代码>读取双打。

其他提示

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

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

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

但没有理由在实践中真正这样做。不要使用 %fprintf 类型参数 double. 。这是诞生于 C89/90 时代的一个普遍习惯,但却是一个坏习惯。使用 %lfprintf 为了 double 并保留 %f 保留 float 论据。

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top