阶乘递推用 static不理解这个代码

img


(代码是对的)我看不懂。。
问问n既然没有赋初值,它是怎么变化的呢
还有static起什么作用 谢谢大佬了

n有初值啊,你使用这个函数时候括号内你输入的n就是初值
static用于局部变量,使得f只在第一次使用函数时被初始化为1,之后再次使用无需再初始化,f的值保持为1

当n=1的时候,f=1
当n=2的时候,f=1
当n=3的时候,f=1 * 2
....
每次加载函数的时候,f的默认值都指向了另一个新值。所以就能达到递归的效果。

img

img

简要的解答
  • 函数fac()中的f变量的「存储持续性」是静态的,变量f在程序运行期间一直存在。类似于全局变量那样,不过只能够在函数fac()中访问。
  • n是「形式参数」,它的值由「实际参数」给出。例如调用fac(1)时,n的值就是1
  • 程序执行过程中各个值的变化,如图所示:

img

以下是详细的解答。

关于存储持续性

每一个变量都有存储持续性,常见的存储持续性有两种:「自动存储持续性」和「静态存储持续性」。

一般来说,函数中的非const,非static变量,都是「自动存储持续性」的。

以如下的函数为例:

void foo() {
    int a = 1;
    int b = 2;
    return a + b;
}

变量ab的存储持续性是「自动存储持续性」。在调用函数foo()时,会专门为该函数生成一块栈空间,变量ab就位于这块栈空间中;函数foo()执行完成后,会回收这块栈空间,变量ab对应的内存也就不存在了。因为这个过程是自动进行的,不需要程序员干预,所以叫做「自动存储持续性」。

函数中的static变量,还有全局变量,都是「静态存储持续性」的,程序刚开始运行的时候,就为这些变量分配内存了。你可以结合全局变量来理解函数里面的static变量。

关于实参与形参

对于函数int fac (int n) {...},参数列表中的n叫做形式参数,你可以理解为占位符n的值只有在函数调用的时候才能够确定下来。

例如:

  • 执行fac(1)时,函数的实际参数是1,此时n的值就是1
  • 执行fac(2)时,函数的实际参数是2,此时n的值就是2

main()函数中调用fac()函数时,可以将main称为「主调函数」,将fac称为「被调函数」。主调函数main会将参数的值放到一个特定的地方(可能是某个寄存器中,也可能是栈中的某个位置,这是由编译器还有调用约定决定的),然后被调函数fac就会在那个位置去取出对应的参数。

例如在main()函数中执行fac(1),主调函数main会将实际参数1放到一个约定好的地方,然后由被调函数fac将其取出,并赋值给n

第一个问题:n为什么不需要赋值:
因为n是函数传参的形参(形式参数),它的值是通过后面传进来的,所以不需要赋值,在你使用的函数的时候得传给他一个值。
第二个问题:static的作用
static是定义静态变量用的,具体的静态变量,全局变量以及局部变量你可以参考C++——菜鸟教程。