作用域和连接针对空间上来将的那么时间上有存储时期来负责
存储时期:
1.静态
2.自动
静态是指他在程序运行时一直存在
具有文件作用域的变量具有静态存储时期,但是具有文件作用域的变量,关键子 static 表示连接类型
总上c变量的5中存储类
上述代码如果你调试的话:那么在调试时会跳过static int stay=1;这条语句的,而int fade=1不会跳过!
这说明静态变量(包括文件作用域变量和代码块加有static的变量),在程序加载入内存时,已经存在了
更多请看<<c primer plus>>12章
存储类 | 时期 | 作用域 | 连接 | 声明方式 |
自动 | 自动 | 代码块 | 空 | 代码块内 |
寄存器 | 自动 | 代码块 | 空 | 代码块内,使用register |
具有外部连接的静态变量 | 静态 | 文件 | 外部 | 所有函数之外 |
具有内部连接的静态变量 | 静态 | 文件 | 内部 | 所有函数之外,使用static |
空连接的静态 | 静态 | 代码块 | 空 | 代码块内,使用static |
静态: 一直存在,变量的位置固定不动
重点在具有代码块作用域的静态变量:例如 {static int a;.....}
在代码块中的 static int a ;
和 int b;
两者的不同在于初始化的不同
static 的变量,也就是a只在编译是初始化
而b在每次调用时都初始化
#include
<
stdio.h
>
/**/ //
void Print( void )
... {
int fade = 1;
static int stay = 1;
printf("fade = %d and stay = %d ",fade++,stay++);
}
int main_scop = 0 ;
int main()
... {
for(int i=0;i<2;i++)
...{
Print();
}
return 0;
}
/**/ //
void Print( void )
... {
int fade = 1;
static int stay = 1;
printf("fade = %d and stay = %d ",fade++,stay++);
}
int main_scop = 0 ;
int main()
... {
for(int i=0;i<2;i++)
...{
Print();
}
return 0;
}
调试时会跳过static int stay=1;的!!!!!
更多详看<<c primer plus>> 12章