scanf函数输入double类型需要注意的地方

下列代码
double a,b,c;
scanf("%f%f%f",&a,&b,&c);
printf("%f%f%f",a,b,c);
打印结果:512181,17989019,86000000
可以看到为3个随机数
为啥会这样呢?

scanf读%f时,系统会按照4字节长度来读,读完要放到一个4字节的空间位置,也就是一个float所在的位置。那么double有8字节空间,比4字节还大,能不能来放?答案是不能。因为float和double的关系不像int和long的关系那样,简单的在后面增加4字节的位置。float和double有自己专门的数据排列格式,如下:如果读的时候明明是按照float的格式来读,但是却存在double的空间内,并且之后一直按double来操作,那么里面数据的符号位、阶码、尾数就全错位了。除非你在用的时候把每个double强制转换成float来用,但是何必多次一举?同理,如果读用%lf来读,却存在float中,不仅格式错位,而且存储空间也不够,会有数据丢失。所以用scanf读的时候,读%f就规规矩矩的放进float中来存,读%lf就放进double中,这样在使用的时候里面的数据才不会错位。在printf的时候,首先C里面的float其实在使用过程中都是被隐式转换成了double来用。所以你在printf时用float还是double其实是一样的。用%f和%lf都可以。

所以正确的写法是
double a,b,c;
scanf("%lf%lf%lf",&a,&b,&c);

猜你喜欢

转载自blog.csdn.net/wutieliu/article/details/88054123