who 调用 who 啊 ?

ZCH999999999 2009-02-18 02:19:50
int hanshu(int);
main()
{
int c;
c=getchar();
printf("%c",hanshu(c));
}

int hanshu(int x)
{
if(x!=EOF)
{
main();
return x;
}
}
请各位帮我解释一下执行的顺序,谁调用谁啊这是?谢谢
...全文
165 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
ZM27080401 2009-02-18
  • 打赏
  • 举报
回复
是个很有意思的程序,考察了很多东西啊,
第一个是递归,第二个是取字符函数,第三个是函数调用,第四个是字符输出,第五是形参和实参
int hanshu(int);
main()
{
int c;
c=getchar();
printf("%c",hanshu(c));
}

int hanshu(int x)
{
if(x!=52) /*输入参数到4结束 52是4的ascii码,10代表是换行符*/
{
main();
return x;
}
}
测试参数是 1,2,3,4 输入如下:
输入是:
1 回车 | ps:从main()启动调用hanshu,第一次
2 回车 | 将1压入栈底,当hanshu调用main()时,c=getchar()是不会产生输入中断的,
3 回车 | 紧跟着是把回去符压入栈的第二位,如此直到输入4时,栈也就压倒头了,而4后
4 回车 | 的回车没有进到栈里,但是在屏幕上有它的位置,那就是换行了。
4 回车 | 输出就是个递归出栈的过程了,由于形参X已经被改成4了,return出的第一个就是4
3 回车 | 第二字符是3后面的回车符,如此直到1,出栈完毕,栈底的最后一个字符是1,所以
2 回车 | 光标在1的后面
1光标1后面停住

总结是,输入8个字符,被压入7个,输出7个,main()是主调函数,整个程序构成了一个递归循环体,所以应当是main()为主调度函数,它能引起int 21h中断,这是我个人认为的,供LZ看看
qingyaoli 2009-02-18
  • 打赏
  • 举报
回复
这不会又是某公司面试题吧....
wlk 2009-02-18
  • 打赏
  • 举报
回复
喔,楼主那个强呀
cd_news 2009-02-18
  • 打赏
  • 举报
回复
学习了啊,这样也行!呵呵
whoisthisman 2009-02-18
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 zmlovelx 的回复:]
printf("%c",hanshu(c));
关键在这一句,想要输出必须先调用hanshu(c)才能得到输出的值,而hanshu又要调用main
这样当遇到ctrl+z(EOF)时,才输出值,此时最后输出的值最先打印出来.从后往前依次输出.
[/Quote]

哦,果然,我不知道EOF是ctrl+z,太挫了
帅得不敢出门 2009-02-18
  • 打赏
  • 举报
回复
printf("%c",hanshu(c));
关键在这一句,想要输出必须先调用hanshu(c)才能得到输出的值,而hanshu又要调用main
这样当遇到ctrl+z(EOF)时,才输出值,此时最后输出的值最先打印出来.从后往前依次输出.
iambic 2009-02-18
  • 打赏
  • 举报
回复
哈哈,谁写的SB程序?
Dinelgua 2009-02-18
  • 打赏
  • 举报
回复
写的好

双函数递归调用
顺序如下
main->hanshu-main-hanshu.....->hanshu
跳出递归的条件是hanshu中的if(x!=EOF)

所以整个递归调用由main开始 hanshu结束 中间他俩结对出现互调

向下递归时获取输入 形成一个栈
递归结束条件满足时 将输入出栈并打印

完成了 正向输入 反向输出功能



写的好
yuzl32 2009-02-18
  • 打赏
  • 举报
回复
main()->hanshu(int)->main()
whoisthisman 2009-02-18
  • 打赏
  • 举报
回复
好像是个死循环啊,不能输出的
ljmscsq 2009-02-18
  • 打赏
  • 举报
回复
这就类似一个递归的过程。
在执行printf("%c",hanshu(c)); 的时候
调用hanshu(c)函数,在c不是EOF的时候重新调用主函数
再执行printf("%c",hanshu(c));如此反复。
知道c为EOF递归结束,递归是倒推结果的。所以就从你最后
输入的字符开始从后往前显示结果。
redlives 2009-02-18
  • 打赏
  • 举报
回复
实际上是一个递归调用。
这样就好理解了
  • 打赏
  • 举报
回复
楼主干嘛呢?这样也可以?
ZCH999999999 2009-02-18
  • 打赏
  • 举报
回复
输出结果与输入顺序相反

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧