为什么 scanf() 需要“%lf”来表示双精度数,而 printf() 只需“%f”就可以了?
-
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 中格式说明符和浮点参数类型之间的匹配在 printf
和 scanf
. 。这是
%f
为了float
%lf
为了double
%Lf
为了long double
碰巧的是,当参数类型 float
作为可变参数传递,这些参数被隐式转换为类型 double
. 。这就是为什么在 printf
格式说明符 %f
和 %lf
是等价且可互换的。在 printf
你可以“交叉使用” %lf
和 float
或者 %f
和 double
.
但没有理由在实践中真正这样做。不要使用 %f
到 printf
类型参数 double
. 。这是诞生于 C89/90 时代的一个普遍习惯,但却是一个坏习惯。使用 %lf
在 printf
为了 double
并保留 %f
保留 float
论据。
scanf
需要知道& d
所指向的数据的大小才能正确填充它,而可变参数函数可以将浮点数提升一倍(不完全确定为什么),所以 printf
总是得到 double
。
因为否则scanf会认为你传递的指针指向一个小于double的float,它将返回一个不正确的值。
在C表达式中使用float或double值将导致一个双倍的值,因此printf无法区分。而指向double的指针必须显式地指示scanf与指向float的指针不同,因为指针指向的是重要的。
不隶属于 StackOverflow