一个简单的C程序,看不明白,请解释一下,清楚点,谢谢了。

来源:百度知道 编辑:UC知道 时间:2024/07/06 20:41:11
#include<stdio.h>
void fun(char *a)
{
if(*a)
{
fun(a+1);
printf("%c",*a);
}
}
main()
{
char s[10]="abcd";
printf("处理前字符串=%s\n处理后字符串=",s);
fun(s);
printf("\n");
}

运行结果是:处理前字符串=abcd
处理后字符串=dcba

就是以下过程不明白,怎么会逆序输出来的?

if(*a)
{
fun(a+1);
printf("%c",*a);
}

递归…… 这个挺难讲清楚的。需要你对函数的调用过程比较敏感。

看下面的解释之前一定要先读懂这句话:当一个函数调用它自己的时候,与它调用一个内容完全相同的其他函数的效果是一样的。也就是说,当fun()函数调用它自身的时候,其效果相当于它调用了一个同样叫做fun()的其他的某个函数。

请拿出一张草稿纸来,一边看解释一边画画图~

我们拿三个字母做例子:

处理前字符串=abc。

之后程序进入fun(s)进行计算。此时*a = 'a'。进入if语句后,它调用了fun(a+1)。依照前面的那句话,我们想象它调用的不是原版的fun(),而是一个山寨fun()。

这个山寨的fun(s)开始执行。此时山寨fun()里面的山寨指针a指向'b'。经过if语句后,它又调用了一个fun(a+1)。于是又一个山寨fun()开始执行了。我们把它叫做第二版山寨fun()函数。

这个第二版的山寨fun(),它里面的变量a也是经过两次山寨之后的版本。这个a指向'c'。进入if语句后,它调用了第三版的山寨fun()。

但是这次,第三版山寨fun()就没法通过if语句了。因为它的指针指向了'c'后面的'\0'。*a = '\0',所以这个函数直接运行结束了。
运行结束之后它该转到原先调用它的地方执行了。那么是谁调用了第三版山寨fun()呢?是第二版山寨。于是我们回到第二版的山寨接着执行。

第二版的山寨刚才执行到了fun(a+1);语句,所以接下来它该执行printf("%c",*a); 了。但是别忘了这个a也是第二版山寨的a!所以这个a它是指向'c'的,所以先输出在屏幕上的就是c了。输出完以后这个第二版山寨函数也就没有语句了。所以它再返回。

像刚才一样仍然是返回到调用这个函数的地方执行。于是我们回到了第一版山寨fun(),输出了第一版山寨变量a,它指向的是'b'。所以第二个输出的是b。你可以看