关于这个问题主要是在cprime书练习的时候我出现的的一个小bug
对于c语言的菜鸟来说 小小记录一下
这个题是这样的:
编写一个程序, 提示用户输入一个double类型的数, 并打印该数的立方值。 自己设计一个函数计算并打印立方值。 main()函数要把用户输入的值传递给该函数
看上去是不是很简单
然后我就开始写了
#include<stdio.h>
void cube(double n);
int main(void){
double i;
printf("请输入一个数字:");
scanf("%f",&i);
cube(i);
return 0;
}
void cube(double n){
printf("这个数字是 %f\n",n);
printf("数字 %f的立方是:%f\n",n,n*n*n);
}
🌳 看看出了bug?
最后输出的结果:
❓为啥会这样
然后我就去查了
💮 接下来来自一个大佬的回答:
为什么double类型输入(scanf)用%lf,输出(printf)用%f? - 左天佑的回答 - 知乎 https://www.zhihu.com/question/55529981/answer/145158602
float是浮点型,double是double float的意思,也就是双精度浮点型。%f是以float类型格式化输入或输出,%lf是long float的意思(估计是和%ld对应),也就是指double类型。
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都可以。
🍺 原来如此!
于是回去刷刷修改了代码
void Cube(double num);
int main() {
double num;
printf("请输入一个 double 类型的数:");
scanf("%lf", &num);
// 调用函数计算并打印立方值
Cube(num);
return 0;
}
// 函数定义
void Cube(double num) {
double cube = num * num * num;
printf("该数的立方值为:%.2lf\n", cube);
}
cube = num * num * num;
printf("该数的立方值为:%.2lf\n", cube);
}
结果!😆
原来问题是出在这里!
🌱之后要好好注意输入输出的类型匹配的问题了!同时记得你要为你创建的每一个变量的值负责!也就是要赋初值,不要一上来就做计算~
🌈ok,完结~ (●ˇ∀ˇ●)点个赞 点个赞~