scanf和double的问题

scanf和double的问题,c,scanf,C,Scanf,我很难理解为什么会发生这种情况: 使用以下代码 #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; } #包括 in

我很难理解为什么会发生这种情况: 使用以下代码

    #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;
    }
#包括
int main()
{
双x=123;
printf(“x是%f。为x输入一个新值。\n”,x);
scanf(“%f”、&x);
printf(“x是%f\n”,x);
返回0;
}
输入45678作为x的新值时,将打印“x为123.000017”。 我知道在扫描时使用%lf时这是固定的,但为什么在使用%f时会发生这种情况

 scanf("%f", &x);
应该是

 scanf("%lf", &x);
浮点转换说明符在
printf
scanf
之间存在错误对称

还要注意的是,
lf
转换说明符相当于
printf
中的
f
转换说明符(从c99开始,它以前没有定义)

我知道在扫描时使用%lf时这是固定的,但为什么在使用%f时会发生这种情况

 scanf("%f", &x);
scanf
中的
f
转换说明符需要指向
float
的指针类型的参数。通过向
double
传递指针类型的参数,可以调用未定义的行为

应该是

 scanf("%lf", &x);
浮点转换说明符在
printf
scanf
之间存在错误对称

还要注意的是,
lf
转换说明符相当于
printf
中的
f
转换说明符(从c99开始,它以前没有定义)

我知道在扫描时使用%lf时这是固定的,但为什么在使用%f时会发生这种情况

 scanf("%f", &x);
scanf
中的
f
转换说明符需要指向
float
的指针类型的参数。通过向
double
传递指针类型的参数,可以调用未定义的行为

我知道在扫描时使用%lf时这是固定的,但为什么在使用%f时会发生这种情况

 scanf("%f", &x);
printf
scanf
函数参数之间的区别在于,您将值传递给
printf
,但传递给
scanf
的是指针(即值的地址)。根据C规则,当一个函数接受数量可变的参数时,所有参数都会发生变化

促销活动之一是将
float
s转换为
double
,与
short
s转换为
int
的方式相同。这就是为什么您可以将
%f
%lf
printf
一起使用的原因:这两种类型的值都由编译器转换为
double
,因此访问它们是安全的

但是,对于指针没有这样的规则(并且有一个很好的理由:尝试将
double
写入
float
的空间将是未定义的行为)。这就是为什么在向
scanf
函数族传递参数时,必须区分
%f
%lf

我知道在扫描时使用%lf时这是固定的,但为什么在使用%f时会发生这种情况

 scanf("%f", &x);
printf
scanf
函数参数之间的区别在于,您将值传递给
printf
,但传递给
scanf
的是指针(即值的地址)。根据C规则,当一个函数接受数量可变的参数时,所有参数都会发生变化

促销活动之一是将
float
s转换为
double
,与
short
s转换为
int
的方式相同。这就是为什么您可以将
%f
%lf
printf
一起使用的原因:这两种类型的值都由编译器转换为
double
,因此访问它们是安全的


但是,对于指针没有这样的规则(并且有一个很好的理由:尝试将
double
写入
float
的空间将是未定义的行为)。这就是为什么在向
scanf
函数族传递参数时必须区分
%f
%lf
的原因。

+1用于正确解释
默认升级
+1用于正确解释
默认升级