源自《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就没有任何意义了