Closed. This question needs to be more focused. It is not currently accepting answers. Learn more。
想改进这个问题吗?更新问题,使其只关注一个问题editing this post。
两年前关闭。
输出:5342312233445
我不理解这段代码中发生的导致上述输出的控制流。有人能解释一下吗。提前谢谢:)
产生:
func1(3)打印3并调用func2(1)。
func2(1)打印1并调用func1(2)。
func1(2)打印2个调用func2(0)。
func2(0)立即返回。
现在我们已经到达递归的底部。现在我们已经建立了一个函数调用堆栈。
功能1(3)
功能2(1)
功能1(2)
一旦func2(0)返回,对func1(2)的调用就会从它停止的地方开始,然后我们从下往上遍历堆栈。
func1(2)打印2并返回func2(1)。
func2(1)打印2,因为它递增n,并返回func1(3)。
func1(3)打印3并返回main()。
主程序()返回和程序退出。
想改进这个问题吗?更新问题,使其只关注一个问题editing this post。
两年前关闭。
#include<stdio.h>
void func1(int n)
{
if(n==0) return;
printf("%d",n);
func2(n-2);
printf("%d",n);
}
void func2(int n)
{
if(n==0) return;
printf("%d",n);
func1(++n);
printf("%d",n);
}
void main()
{
func1(5);
}
输出:5342312233445
我不理解这段代码中发生的导致上述输出的控制流。有人能解释一下吗。提前谢谢:)
最佳答案
如果我们对每个printf
进行注释,这样就更容易理解,这样我们就可以从程序的哪个部分判断出哪个数字。我也要把开始的条件改成3,这样我们就可以走完整个过程了。
#include <stdio.h>
void func2(int);
void func1(int n)
{
if(n==0) return;
printf("func1 before: %d\n",n);
func2(n-2);
printf("func1 after: %d\n",n);
}
void func2(int n)
{
if(n==0) return;
printf("func2 before: %d\n",n);
func1(++n);
printf("func2 after: %d\n",n);
}
int main()
{
func1(3);
}
产生:
func1 before: 3
func2 before: 1
func1 before: 2
func1 after: 2
func2 after: 2
func1 after: 3
func1(3)打印3并调用func2(1)。
func2(1)打印1并调用func1(2)。
func1(2)打印2个调用func2(0)。
func2(0)立即返回。
现在我们已经到达递归的底部。现在我们已经建立了一个函数调用堆栈。
功能1(3)
功能2(1)
功能1(2)
一旦func2(0)返回,对func1(2)的调用就会从它停止的地方开始,然后我们从下往上遍历堆栈。
func1(2)打印2并返回func2(1)。
func2(1)打印2,因为它递增n,并返回func1(3)。
func1(3)打印3并返回main()。
主程序()返回和程序退出。
关于c - 请解释这个C程序的工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42185131/
10-12 05:20