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用于正确解释默认升级