1. static
- 静态局部变量
函数中局部变量的值调用结束后不消失,保持原值
即占用的存储单元不释放,下一次调用该函数时,该变量保留上一次函数调用结束时的数
#include "iostream"
#include <string.h>
using namespace std;
void f1()
{
int static i = 3;
cout << i;
i = i + 1;
}
int main()
{
f1(); // 3
f1(); // 4
f1(); // 5
}
说明:
1) 静态局部变量,在静态存储区内分配存储单元,程序整个运行期间都不释放
2)静态局部变量,赋初值是在编译时进行,只赋值一次。
以后每次调用函数时不再重新赋初值,只是保留上次函数调用结束时候的值
3)静态局部变量,不赋初值。编译时自动赋初值0(数值变量),或空字符(字符型变量)。
4)静态局部变量,虽然调用后任然存在,其它函数不能引用,在其它函数不可见
- 静态外部变量
定义外部变量时加一个static声明
希望某些外部只限于被本文件引用,而不能被其他文件引用
using namespace std; //file 1
extern int i;
int main()
{
cout<<i;
}
static int i = 3; //file 2
2. extern
- 一个文件内声明全局变量
如果外部变量不在文件开头定义,有效范围只限于定义处到文件终了。
定义点之前函数想引用全局变量,引用之前用关键字extern对该变量做外部声明,
表示该变量是一个将在下面定义的全局变量
extern int a;
int main(){
//变量定义之前要使用该变量
cout << a;
//放这里不行,好像是因为要在函数外部定义
}
int a = 10;
//用于函数定义 表示全局可见的
//用于变量 表示在其他地方定义
- 多文件程序中声明外部变量
问题:一个文件想引用另一个文件中已定义的外部变量x。
做法:一个文件中定义外部变量x,另一文件中用extern对x做外部声明。
extern int x
编译系统由此知道x是一个已在别处定的外部变量,先在本文件中找有无外部变量x。如果有,则将其作用域拓展到本行,还是和“一个文件内声明全局变量”一样。
如果本文件中没有,则程序连接时候从其他文件中找有无x,如果有,则吧另一文件中定义的外部变量x的作用域拓展到本文件。
file1
int i = 3;
file2
extern int i;
int main()
{
cout<<i;
}
虽然extern拓展全局变量作用于为设计带来方便,但是要小心,在执行一个文件中的函数时,可能会改变了该全局变量的值
3. auto
会根据变量初值自动选择变量类型
auto i;
4. register
int main()
{
register int i = 3;
cout<<i;
}
一般情况,变量存储在内存中。程序用到哪一个变量值时,控制器发出指令将内存中该变量值送到CPU运算器。
经运算器运算,如果需要存数,再从运算器将数据运到内存存放。
如果一些变量使用频繁,存取变量耗时长,为提高执行效率,c++允许将局部变量值存放在CPU寄存器中。
需要时,直接从寄存器取出参加运算,不必到内存中取,寄存器存取速度远高于对内存存取速速度,用关键字register声明。
定义的寄存器变量对编译系统只是建议性的(不是强制性),当今优化编译系统能够识别使用频繁的变量,从而自动将这些变量放在寄存器中,而不需要程序设计者指定。
实际上register是不必要的。