n有初值啊,你使用这个函数时候括号内你输入的n就是初值
static用于局部变量,使得f只在第一次使用函数时被初始化为1,之后再次使用无需再初始化,f的值保持为1
当n=1的时候,f=1
当n=2的时候,f=1
当n=3的时候,f=1 * 2
....
每次加载函数的时候,f的默认值都指向了另一个新值。所以就能达到递归的效果。
fac()
中的f
变量的「存储持续性」是静态的,变量f
在程序运行期间一直存在。类似于全局变量那样,不过只能够在函数fac()
中访问。n
是「形式参数」,它的值由「实际参数」给出。例如调用fac(1)
时,n
的值就是1
。以下是详细的解答。
每一个变量都有存储持续性,常见的存储持续性有两种:「自动存储持续性」和「静态存储持续性」。
一般来说,函数中的非const
,非static
变量,都是「自动存储持续性」的。
以如下的函数为例:
void foo() {
int a = 1;
int b = 2;
return a + b;
}
变量a
和b
的存储持续性是「自动存储持续性」。在调用函数foo()
时,会专门为该函数生成一块栈空间,变量a
和b
就位于这块栈空间中;函数foo()
执行完成后,会回收这块栈空间,变量a
和b
对应的内存也就不存在了。因为这个过程是自动进行的,不需要程序员干预,所以叫做「自动存储持续性」。
函数中的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++——菜鸟教程。