您的位置:首页 > 移动开发 > 微信开发

关于实验楼给出的一个小程序里面除法永远结果都为0的探索

2016-09-27 22:12 363 查看
首先针对代码设置断点调试了一下。

从下图进入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型运算。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐