static静态关键字修饰的局部变量第一次调用的时候初始化,以后调用的时候不用初始化。
#include<stdio.h>
void fun(int x)
{
int a = x;
int b = 0;
++a; ++b;
printf("a:%d b = %d\n", a,b);
return;
}
int main()
{
for (int i = 10; i > 0; --i)
{
fun(i);
}
return 0;
}
static 修饰int a之后,再执行程序
static int a = x;
#include<stdio.h>
static void fun(int x)
{
static int a = x;
int b = 0;
++a; ++b;
printf("a:%d b = %d\n", a,b);
return;
}
int main()
{
for (int i = 10; i > 0; --i)
{
fun(i);
}
return 0;
}
static修饰的局部变量存储在.data 区,定义并初始化一次,执行一次。
(static 修饰的变量在data区会有一个标记语,刚开始为0,经过一次执行后,标记语会变为1,系统看到标记语就会知道不执行)
#include<stdio.h>
void fun(int x)
{
static int a = x;//定义并初始化,执行一次
int b = 0;
a = x;//每次都执行,不是定义初始化,这句是给a赋值
++a; ++b;
printf("a:%d b = %d\n", a,b);
return;
}
int main()
{
for (int i = 10; i > 0; --i)
{
fun(i);
}
return 0;
}
extem关键字
extem用在全局变量或函数的声明前,用来说明"此变量/函数是在别处定义的,要在此处引用" .
在同一工程下,使用其他文件下的函数时,加上外部关键字extem。
eg:extern int g_max;extern void fun()
告诉编译器,g_max,fun()在其他文件下.就可以使用
但若是在全局变量或者函数前加上静态关键字static,那么此全局变量或函数只能在本文件下调用(限定了此变量或函数的使用范围),不能被其他文件调用
所以,我们要是想让某一全局变量或函数只在本文件下使用,就可以在它前面加上静态关键字static,static int g_min 改变其可见性。即使其他文件下想使用,extern int g_max,加上外部关键字extern,也不能调用。
总结:静态关键字static修饰局部变量改变其生存期,可见性不变。静态关键字static修饰全局变量和函数时改变其可见性(只能在本文件下使用,即使其他文件加了外部关键字extern也不能调用),不改变生存期。