static在C中有两个作用:
1.在函数内修饰一个静态局部变量,该变量在函数调用时保持值不变
2.修饰一个静态全局变量,给全局变量只在当前源文件内可见
关于第一点,静态局部变量举两个例子:
#include <stdio.h>
void foo()
{
int a = 10;
static int sa = 10;
a += 5;
sa += 5;
printf("a = %d, sa = %d\n", a, sa);
}
int main()
{
int i;
for (i = 0; i < 10; ++i)
foo();
}
输出:
a = 15, sa = 15
a = 15, sa = 20
a = 15, sa = 25
a = 15, sa = 30
a = 15, sa = 35
a = 15, sa = 40
a = 15, sa = 45
a = 15, sa = 50
a = 15, sa = 55
a = 15, sa = 60
当函数被调用的时候,如果函数需要保持一些状态不变,而又不想使用全局变量,那么就可以使用静态局部变量。
用汉诺塔为例,使用递归调用很容易解决汉诺塔问题,如果递归调用的时候我们希望一个变量记录调用次数,也就是移动盘子的次数,那么这个变量就要用static修饰:
// move n plates from a to c by b
void hannoi(int n,char a,char b,char c)
{
static int step=1;
if(n==1)
{
printf("step %d : move %d from %c to %c\n",step++,n,a,c);
return;
}
hannoi(n-1,a,c,b);
printf("step %d : move %d from %c to %c\n",step++,n,a,c);
hannoi(n-1,b,a,c);
}
int main()
{
hannoi(10,'A','B','C');
return 0;
}
static修饰的成员变量称为静态成员变量。与普通的成员变量不同,静态成员变量不需要实例化就已经存在,而且类的所有对象共享这个静态成员变量。需要注意的是不能再类中对静态成员变量初始化,如果当这个类的定义放在头文件中,那么甚至不能在这个头文件中初始化静态成员变量。对静态成员变量初始化放在.cpp文件中进行。
static修饰的成员变量称为静态成员函数。静态成员函数可以用类名直接调用,而不需要实例化对象。因为静态成员函数不属于任何一个类的实例,所以静态成员函数只能操作静态成员变量。