Mea*_*ead 4 c recursion static
根据我的理解,每个被调用的函数在程序堆栈中都有一些分配给它的内存,即使同一个函数递归调用自身(即每个调用在程序堆栈中都有自己的内存),这也是正确的.请回答以下两个问题:
如果变量在函数中声明为static,那么同一个变量/同一个副本是否会用于该函数的所有递归调用?
如果变量未声明为static(例如,简单地称为"int x"),那么对函数的每个递归调用是否都有自己的变量副本?如果是,那是从其他函数调用函数时通常会发生的方式,包括递归调用吗?
#include<stdio.h>
#include<stdlib.h>
int main()
{
static int x=0;
x++;
printf("Team %d\n",x);
if(x<10)
main();
else
exit;
}
Run Code Online (Sandbox Code Playgroud)
输出:
Team 1
Team 2
Team 3
Team 4
Team 5
Team 6
Team 7
Team 8
Team 9
Team 10
Run Code Online (Sandbox Code Playgroud)
qua*_*dev 13
如果变量在函数中声明为static,那么同一个变量/同一个副本是否会用于该函数的所有递归调用?
是的,正如您的代码示例所示
如果变量未声明为static(例如,简单地称为"int x"),那么对函数的每个递归调用是否都有自己的变量副本?如果是,那是从其他函数调用函数时通常会发生的方式,包括递归调用吗?
是的,每个调用都有自己的堆栈帧,每个局部变量都有一个副本.这是每个函数调用发生的事情,无论它们是否递归.是的,这个原则允许,其中包括递归.
小智 5
静态变量是程序的生命,只有一个副本
本地(Autos)在每个函数调用的堆栈上获得一个新副本.
按值传递的参数也会获得新副本.
通过引用传递的参数(指针)指向传递给它们的副本.因此,如果它是递归执行中的本地,它可能是唯一的副本; 但通常它是对在递归开始之前调用函数的变量的引用,因此,它是相同的副本.
最好通过将指针传递给变量来执行您正在执行的功能,您可以更好地控制后续的递归实例.