关于实验楼给出的一个小程序里面除法永远结果都为0的探索
-
首先针对代码设置断点调试了一下。
-
从下图进入div.c调试的时候可以看出,%lf,也就是double类型的除数输出是0,但是%d,也就是整数除数是正确的结果。
-
怀疑是由于类型转换的原因,于是我就增加了一行强制转换类型的代码:
(double)a/(double)b
-
可以看出,这一次在函数内部单步调试的时候,强制转换后除的结果并不为0,但是在main函数里的输出结果依旧是0!
-
这就很奇怪了,我明明把div.c中
return a/b
改成了return (double)a/(double)b
,为什么main中还是得不出正确结果? -
难道是因为链接出了问题吗?这不科学……我尝试着把所有函数移到了主函数里:
-
WHAT!!!!为什么这次又可以了!而且很奇怪的是之前单步运行的时候在函数中不加类型转换直接a/b的话得出的值是0,但是这次
return a/b
得出的值却是正确的。。。 -
单步调试之后更加茫然……
问题已解决,谢谢各位
http://group.cnblogs.com/topic/75520.html
总结
一、程序程序除法结果为0的根本原因
1.main.c中缺少之前定义的head.h头文件,就是因为在编程的时候也没有加,因此才会在编译的时候出现一堆隐式函数声明的警告。
2.在编译运行多个c文件组成的代码时,一定要记得加上include "xxx.h"
,将程序链接起来,否则就会出现很多不必要的麻烦。
二、对程序除法的优化
1.从这次的程序本身的角度来看,有一个可以改进的地方,我们得到的除法值是整除的值,但是我们更期待能精确到小数。
2.return a/b的时候,因为a和b都是int型的,所以先得出a/b的整除值,然后进行反回,由于div是double型的所以把整除值转换为double类型,举例来说,如果是5/4,由于整除结果为1,输出就只能得到1.000000。
3.有两个方法可以解决这个问题,
(1)将返回改为:return (a+0.0)/(b+0.0);
就可以得到精确的值,这是因为当小数参加运算会转成double型。
(2)将返回改为:return (double)a/(double)b;
通过强制类型转换,实现double型运算。