zoukankan      html  css  js  c++  java
  • 关于实验楼给出的一个小程序里面除法永远结果都为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型运算。

  • 相关阅读:
    stack, deque 和 queue的对比
    Android 修改圆形progressBar颜色
    java.lang.OutOfMemoryError: Failed to allocate a 3110419 byte allocation with 741152 free bytes and
    Android GreenDAO 3.0 不修改版本号的情况下增加、删除表、添加字段
    Android监听安装卸载
    Android实现异步的几种方法
    Android GreenDao清空数据库的方法
    Android 6.0 动态权限申请
    Android无需权限显示悬浮窗
    Android 极光推送JPush---自定义提示音
  • 原文地址:https://www.cnblogs.com/alovera/p/5912371.html
Copyright © 2011-2022 走看看