我无法理解为什么会发生这种情况:
使用以下代码;
#include <stdio.h>
int main()
{
double x=123;
printf("x is %f. Enter a new value for x.\n", x);
scanf("%f", &x);
printf("x is %f\n", x);
return 0;
}
当您输入 45678 作为 x 的新值时,将打印“x is 123.000017”。
我知道当您在扫描时使用 %lf 时,这个问题是固定的,但是为什么在使用 %f 时会发生这种情况呢?
我知道当您在扫描时使用 %lf 时,这个问题是固定的,但是为什么在使用 %f 时会发生这种情况呢?
和...之间的不同printf
and scanf
函数参数是您将值传递给printf
,但要scanf
您传递指针(即值的地址)。根据 C 规则,当函数采用可变数量的参数时,所有参数都会经过默认促销 https://stackoverflow.com/a/1255818/335858.
其中的促销活动之一是float
s 转换为double
,同样的方式short
s 转换为int
。这就是为什么你可以使用%f
or %lf
with printf
:两种类型的值都由编译器转换为double
,因此访问它们是安全的。
然而,对于指针来说没有这样的规则(并且有一个很好的理由:尝试编写一个double
进入一个空间float
将是未定义的行为)。这就是为什么你必须区分%f
and %lf
当传递参数给scanf
函数族。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)