免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1511 | 回复: 7
打印 上一主题 下一主题

[C] 请教一个c语言函数的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-01-09 22:02 |只看该作者 |倒序浏览
本帖最后由 yanaginagi 于 2013-01-09 22:03 编辑

完全没见过这种写法啊
gcc 编译后的输出是120,1
求大神解释~~~
  1. #include <stdio.h>
  2. int fact(i)
  3. int i;
  4. {
  5.         if (i == 0)
  6.                 return 1;
  7.         else
  8.                 return i * fact (i -1);
  9. }

  10. int main(void)
  11. {
  12.         printf("%d , %d \n",fact(5,10),fact(5.0));
  13.         return 0;
  14. }
复制代码

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
2 [报告]
发表于 2013-01-09 22:21 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
3 [报告]
发表于 2013-01-09 22:34 |只看该作者
回复 2# pmerofc

感谢指教!
也就是说 int fact(i) int i;的定义和 int fact(int i)是一样的?
而fact(5.0) 返回结果1 是因为编译器把5.0转换成1了?
正在学编译原理,不是很懂

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
4 [报告]
发表于 2013-01-09 22:42 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
5 [报告]
发表于 2013-01-09 22:45 |只看该作者
那么简单的东西 你连递归函数都没看过吗? 自学的吗?

论坛徽章:
0
6 [报告]
发表于 2013-01-09 23:04 |只看该作者
回复 4# pmerofc


    又拜读了一下你博客的文章,终于理解了,再次感谢你的指导!

论坛徽章:
0
7 [报告]
发表于 2013-01-09 23:12 |只看该作者
解释一下为什么 fact(5.0) 的结果是 1:

(注:以下内容中具体数据并不是所有机器上编译出来的结果都如此,但原理相同)

首先,5.0 是 double 类型的。假设这里 sizeof(double) 是 8 字节,sizeof(int) 是 4 字节。

然后,要为 fact 准备参数的空间,于是就在栈上开了一个能够容纳下 i 的空间,也就是 4 字节的空间。

接着,传参数。这时候有数据类型转换吗?没有(理由 pm 大神已经说了),只管往那 4 个字节的内存里写以 double 形式表示的 5.0,比如 0x4014000000000000。系统是小端存储的话,会依次写入 00 00 00 00 00 00 14 40。所 以,这时候用来表示变量 i 的 4 个字节内存里的数据就是 00 00 00 00,按照 int 翻译一下就是 0。

最后,从 fact 的角度看,它得到的参数是 0,所以返回 1。

论坛徽章:
0
8 [报告]
发表于 2013-01-10 20:51 |只看该作者
回复 7# timothyqiu


    又长知识了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP