| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2826 人关注过本帖
标题:有关函数printd的问题
只看楼主 加入收藏
java_haier
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2018-3-24
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:2 
有关函数printd的问题
以下是《C程序设计语言》第2版中的一个函数
#include <stdio.h>

/* printd: print n in decimal */
void printd(int n)
{
    if (n < 0) {
        putchar('-');
        n = -n;
    }
    if (n / 10)
        printd(n / 10);
    putchar(n % 10 + '0');
}
int main()
{
    int n = 123;
    printd(n);//输出123
    return 0;
}

书本中有如下说明:
函数递归调用自身时,每次调用都会得到一个与以前的自动变量集合不同的新的自动变量集合。因此,调用printd(123)时,第一次调用printd的参数n=123。它把12传递给printd的第二次调用,后者又把1传递给printd的第三次调用。第三次调用printd时首先将打印1,然后再返回到第二次调用。从第三次调用返回后的第二次调用同样也将先打印2,然后再返回到第一次调用。返回到第一次调用时将打印3,随之结束函数的执行。

但是,我还是不明白为什么递归调用之后,首先输出的是1,然后再是2和3,请指教,谢谢!

[此贴子已经被作者于2018-4-8 20:07编辑过]

搜索更多相关主题的帖子: 函数 int 调用 打印 返回 
2018-04-08 20:06
李晨经纪人
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:175
专家分:848
注 册:2018-2-14
收藏
得分:20 
  if (n / 10)                                   //12
        printd(n / 10);                         //12
          if (n / 10)                           //1
        printd(n / 10);                         //1
  if (n / 10)                                    //0  不再继续下一层递归执行下一句putchar
        printd(n / 10);                        
    putchar(n % 10 + '0');                      //1    执行putcha结束第三层递归
    putchar(n % 10 + '0');                      //2    第三层递归调用结束,执行第二层递归的putchar
    putchar(n % 10 + '0');                      //3    同上
2018-04-08 20:38
java_haier
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2018-3-24
收藏
得分:0 
回复 2楼 李晨经纪人
我明白了,谢谢!
putchar(n % 10 + '0')是printd的一部分,所以每次递归之后,都会执行打印,即总共打印3次,我误以为只打印1次
第一层,printd的参数是123,打印的是putchar(123 % 10 + '0'),得到的是3;
第二层,printd的参数是12,打印的是putchar(12 % 10 + '0'),得到的是2;
第三层,printd的参数是1,打印的是putchar(1 % 10 + '0'),得到的是1;
又因为递归是由内向外逐级执行,先执行最内一层,再执行第二层、第一层直至函数执行结束
因此,打印结果是123


[此贴子已经被作者于2018-4-8 21:06编辑过]

2018-04-08 21:04
快速回复:有关函数printd的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015031 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved