C++种变量的存储类别有4种:自动的(auto),静态的(static),寄存器的(register),外部的(extern)。
一、自动变量
函数的局部变量,不加关键字static,编译系统对它们动态地分配存储空间。 用的时候就分配存储空间,不用的时候就释放。这就是自动变量。如
auto int a;
存储类别auto和数据类型int的顺序任意。 关键字auto可以省略,如果不写auto,则系统把它们默认为自动存储类别,它属于动态存储方式。
二、用static声明静态局部变量
如果希望函数中的局部变量在函数调用结束后不消失而是保留原值,即其存储空间不释放,下一次再调用此函数时,该变量保留上一次调用结束时的值,就要指定该局部变量为静态局部变量。如
...
...
int f()
{
static int a=2;
a++;
return a;
}
int main()
{
for(int i = 0 ; i < 3 ; i++)
cout << f();
}
依次输出3,4,5。
注意哟
(1)对静态局部变量是在编译时赋初值的,即只赋初值一次。以后每次调用函数时不再重新赋初值而是保留上一次函数调用结束时的值。
(2)静态局部变量编译时自动赋初值0(对数值型变量)或空字符(对字符变量)。自动变量不赋初值的话,它的值就是一个不确定的值。
(3)虽然静态局部变量在函数调用结束后仍然存在,但其他函数是不能引用它的。
三、用register声明寄存器变量
一般情况下,变量的值是存放在内存中,程序中用到哪一个变量的值,就要从内存中取出该变量的值,再送到CPU中的运算器。如果一个变量使用频繁,那存取变量的值要花不少时间。
为提高效率,C++允许将局部变量的值存放在CPU的寄存器中,需要时直接从寄存器中取出来运算,不必再到内存中去存取。 这种变量叫寄存器变量,用关键字register作声明。
int fac(int n)
{
register int i , f=1;
for(i=1 ; i<=n ; i++)
f=f*i;
return f;
在程序中定义寄存器变量对编译系统只是建议性的。当今的优化编译系统能够识别使用频繁的变量,从而自动地将这些变量存放在寄存器中,而不需要程序设计者指定。因此在实际中不必用register来声明变量。
四、用extern声明外部变量
用extern声明全局变量(外部变量),可以扩展全局变量的作用域。
1、在一个文件内声明全局变量
如果在全局变量的定义点之前的函数想引用该全局变量,用extern对该变量作外部变量声明。
int main()
{
extern int a,b;
cout << max(a,b);
}
int a = 15,b = -7;
int max(int x,int y)
{
return x > y ? x : y;
}
输出15
2、在多文件的程序中声明外部变量
想在一个文件中引用另一个文件中已定义的外部变量,正确做法:在任一文件中定义外部变量,在另一文件中用extern对该变量作外部变量声明。(编译系统会自己去找)
file 1.cpp
extern int a,b;
int main()
{
cout << a << "," << b;
return 0;
}
file 2.cpp
int a = 3 , b = 4;
...
注意哟
1、extern是用作变量声明,而不是变量定义。它只是对一个已定义的外部变量作声明,以扩展其作用域。
2、慎重使用
五、用static声明静态外部变量
如果希望某些外部变量只限于被本文件引用,而不能被其他文件引用,这是可以在定义外部变量时加一个static声明。如 file 1.cpp
static int a=3;
int main()
{
...
}
file 2.cpp
extern int a;
int func (int n)
{
...
a = a * n;
...
}
file 2.cpp文件中虽然用了"extern int a;",但是仍然无法引用file 1.cpp文件中的全局变量a。
|