递归形式的itoa及reverse函数的实现

     源自《The C Programming Language》P75 pr4-12, 4-13:

     

     编写递归版本的itoa及reverse函数

 

     代码:

    

     分析:

 

     1,  itoa函数中,将局部变量i定义为静态局部变量,这样当递归调用itoa函数时,不会重复的定义变量i了,例如:第一次

          调用itoa函数,定义了static int i; , 这样第二次调用itoa函数时,就不会再定义变量i了,而是直接使用第一次itoa函数

          中的i的值

 

     2,  reverse函数这样定义的目的:保持reverse函数的用户接口一致,即只需要传递一个参数(待处理的字符串)

 

     3,  而参考函数reverser的实现方式比自己实现的reverse函数要好,我编写的reverse函数中使用到全局变量beg,end,

          这样安全性不高,内聚度也不高;反之参考的reverser函数将变量beg,end作为reverser的形参,这样就不存在上述

          问题了,并且作为形参的另一个好处:如果不作为形参,而是在reverser定义beg,end,这样,又必须将其定义为

          静态局部变量,并且因为静态局部变量的初始化形式必须是常量表达式,如果定义成static int end = strlen(s) - 1;

          形式将出错,而不这样定义的话,那又无法使用静态局部变量beg, end

 

     4,  在递归函数中定义的静态局部变量的初始化时,注意:

          正确:

          void fun()

          {

                  static int n = 2;

                   ...

                   fun();

          }

          如上所示的定义并初始化方式是正确的,并符合设计者的思路;

          错误:

          void fun()

          {

                  static int n;

                  n = 2;

                   ...

                  fun();

          }

          这种定义方式编译器虽然不会报错,并且也能运行,但逻辑上有问题,不能达到设计者的要求,

          虽然n是static int 型变量,但每次fun函数递归调用自己时,n的值并不能保持上次的值,因为

          在每次进入fun函数后,n的值都会被赋予2,这样定义的静态局部变量n就没有任何意义了

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值