这个问题已经在这里有一个答案:
- 为什么scanf()的需要“%低频”为双打,当printf()的是好的只有“%F”? 5个回答
无法理解为什么出现这种情况IM:用下面的代码;
#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是123.000017”被打印出来。 我知道,当你使用扫描时,LF%,这是固定的,但为什么用%F当出现这种情况?
我知道,当你使用扫描时,LF%,这是固定的,但为什么用%F当出现这种情况?
之间的差别printf
和scanf
函数参数是你值传递给printf
,但scanf
传递指针(即值的地址)。 据到C规则,当一个函数采用可变数量的参数,所有参数进行默认的促销活动 。
其中一个促销的是, float
小号地转化为double
,以同样的方式, short
小号地转化为int
。 这就是为什么你可以使用%f
或%lf
用printf
:这两种类型的值由编译器转换成double
,因此其访问是安全的。
然而,对于指针没有这样的规则(和一个很好的理由:试图写一个double
成的空间float
将是不确定的行为)。 这就是为什么你必须区分%f
和%lf
传递参数的时候scanf
系列函数。
scanf("%f", &x);
应该
scanf("%lf", &x);
有浮动之间的点转换说明一个假对称printf
和scanf
。
还要注意的是lf
转换符相当于f
转换说明中printf
(因为C99,它之前未定义)。
我知道,当你使用扫描时,LF%,这是固定的,但为什么用%F当出现这种情况?
f
在转换指定scanf
需要类型的指针的参数float
。 通过传递指针类型的参数double
调用未定义的行为。