全局变量:
全局变量是在所有函数体的外部定义的,程序 的所有地方可以使用,
甚至在其他文件的代码中也可以使用(但要使用extern),
也就是说全局变量不受作用域的影响,总是可用的。
换句话说,就是全局变量的生命周期一直到程序的结束。
如果在一个文件中使用extern来声明另一个文件中存在的全局变量,那个这个文件就可以使用这个变量。
例:
//file1
#include <iostream>
using namespace std;
int globle;
int main()
{
globle = 111;
return 0;
}
//file2
extern int globle;
void func()
{
//...
}
局部变量:
局部变量也称为自动变量,它们出现在作用域内(或嵌套作用域),离开时自动销毁。
关键字auto,为默认,所以不用声明;
寄存器变量也是一种局部变量,关键字register告诉编译器,尽可能快地访问这个变量。
register变量只能在一个块中声明,不可能有全局的或静态的register变量。然而可以在函数中作为形参。
静态变量:
关键字static
通常,函数中的定义的局部变量在函数作用域结束时销毁。
当再次调用这个函数时,会重新创建该变量的存储空间,其值会重新初始化。
如果想让局部变量的值在程序的整个生命周期里仍然有效,就可以定义这个局部变量为静态,关键字static,
并给它一个初始值,初始值只在函数第一次调用时执行,函数调用之间变量的值保持不变。
问题:为什么不使用全局变量呢?
这里就要强调静态变量的优点了,
一,静态的局部变量,它在函数之外是不可用的。
#include <iostream>
using namespace std;
void func()
{
static int i = 0;//这里只是第一次调用时初始化一下,
cout << "i = " << ++i << endl;
}
int main()
{
for (int i = 0; i < 10; ++i)
func();
return 0;
}
这里如果不使用static,则每次打印的值总是1,而不是不同的值;
二,静态的全局变量,在文件的外部也不可以使用,即它只在本文件的代码中有作用,
即使使用了extern,但连接器不会找到它的,只因为它被声明为static