找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1490|回复: 10
收起左侧

这个C语言函数返回值怎么跟想不一样?

[复制链接]
ID:704014 发表于 2020-3-8 10:14 | 显示全部楼层 |阅读模式
11.jpg #include "REG52.H"fun(int n);
int m;
void main()
{
m=fun(4);
}
fun(int n)
{ int t;
if((n==0)||(n==1))t=3;
else t=n*fun(n-1);
return t; }
这个变量m=3


回复

使用道具 举报

ID:704014 发表于 2020-3-8 10:17 | 显示全部楼层
为什么m=3呢?调试t变量看不见
回复

使用道具 举报

ID:704014 发表于 2020-3-8 13:35 | 显示全部楼层
哦,自己发现问题了,是函数再入问题
回复

使用道具 举报

ID:275826 发表于 2020-3-8 14:16 | 显示全部楼层
函数递归调用,m=72;
回复

使用道具 举报

ID:704014 发表于 2020-3-8 16:33 | 显示全部楼层
tyrl800 发表于 2020-3-8 14:16
函数递归调用,m=72;

上面代码怎样改过来呢,编译一直出错。。
回复

使用道具 举报

ID:704014 发表于 2020-3-8 19:23 | 显示全部楼层
chenzhizhong 发表于 2020-3-8 16:33
上面代码怎样改过来呢,编译一直出错。。

上面的代码出现死循环,把子函数放主函数后面就会死循环,放主函数前面就不会,为什么呢?
回复

使用道具 举报

ID:704232 发表于 2020-3-9 00:39 | 显示全部楼层
  1. #include <stdio.h>

  2. int fun(int n)
  3. {
  4.     int t;
  5.     if(n==0||n==1) t=3;
  6.     else t=n*fun(n-1);
  7.     return t;
  8. }

  9. void main()
  10. {
  11.     int m;
  12.     m=fun(4);  //fun(4)=4*fun(3)=4*3*fun(2)=4*3*2*fun(1)=4*3*2*3=72,因此返回值t为72
  13.     printf("%d\n",m); //m=72
  14. }
复制代码
回复

使用道具 举报

ID:704232 发表于 2020-3-9 00:43 | 显示全部楼层
chenzhizhong 发表于 2020-3-8 19:23
上面的代码出现死循环,把子函数放主函数后面就会死循环,放主函数前面就不会,为什么呢?

C程序是从上往下编译的,子函数放后面的话就不知道fun()函数,你可以把子函数放主函数前面,或者在主函数里面声明一下int fun(int n);
回复

使用道具 举报

ID:532564 发表于 2020-3-9 05:57 | 显示全部楼层
我比较好奇你编译的时候有没有warning,毕竟从来没有尝试过定义函数不给返回值类型,一开始我以为如果没有返回值类型就默认为void,但是后面说有结果输出,看来是可以这么写的啊
回复

使用道具 举报

ID:496117 发表于 2020-3-9 11:27 | 显示全部楼层
stephanie_han 发表于 2020-3-9 05:57
我比较好奇你编译的时候有没有warning,毕竟从来没有尝试过定义函数不给返回值类型,一开始我以为如果没有返 ...

c语言默认init,以前的程序都不严谨
回复

使用道具 举报

ID:496117 发表于 2020-3-9 11:27 | 显示全部楼层
你需要学习一下c语言基础,递归都没了解啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表