一、普通全局变量和普通局部变量的关系
通常情况下,如果有两个同名变量,一个是普通全局变量,另一个是普通局部变量,那么局部变量在其作用域内具有较高的优先权,它将屏蔽全局变量。
#include <stdio.h>
#include<iostream>
int count = 1;
using namespace std;
int fun(void)
{
int count = 10;
return count;
}
int main(void)
{
cout<<fun()<<endl;
return 0;
}
如果全局变量定义在某个定义函数之后,并且定义函数中有相应的全局变量,此时程序会报错。
如下程序所示:
#include <stdio.h>
#include<iostream>
using namespace std;
int fun(void)
{
return count;
}
int count = 1;
int main(void)
{
cout<<"fun()="<<fun()<<endl;
return 0;
}
如果我们希望在局部变量的作用域内使用同名的全局变量,那么可以在该变量的前面加上“::”,此时就代表全局变量,::就是作用域运算符。
#include<iostream>
using namespace std;
int count = 10;//全局变量定义
int main(void)
{
int count;//局部变量的定义
count = 100;
cout <<"local value="<<count<<endl;
cout <<"global value="<<::count<<endl;
return 0;
}
二、static局部变量与普通局部变量的区别
static局部变量只被初始化一次,下一次依据上一次结果值。函数static变量在函数中有效,第一次进入函数初始化(而不是进入相应的初始化语句)。以后进入函数将沿用上一次的值。
#include<iostream>
using namespace std;
int fun(void)
{
static int count = 10;// 事实上此赋值语句从来没有执行过 函数中定义的static变量在第一次进入函数的时候初始化,而不执行这条语句
return count--;
}
int main(void)
{
cout<<"fun()="<<fun()<<endl; //输出10
cout<<"fun()="<<fun()<<endl; //输出9
cout<<"fun()="<<fun()<<endl; //输出8
cout<<"fun()="<<fun()<<endl; //输出7
cout<<"fun()="<<fun()<<endl; //输出6
return 0;
}
对于普通局部变量来说,程序如下
#include<iostream>
using namespace std;
int fun(void)
{
int count = 10;
return count--;
}
int main(void)
{
cout<<"fun()="<<fun()<<endl; //输出10
cout<<"fun()="<<fun()<<endl; //输出10
cout<<"fun()="<<fun()<<endl;
cout<<"fun()="<<fun()<<endl; //输出10
cout<<"fun()="<<fun()<<endl; //输出10
return 0;
}
对于普通局部变量来说,每次进入函数初始化一次。
三、static局部变量和static全局变量的关系
1、初始化
全局static变量的初始化在编译的时候进行。在main函数被调用之前初始化并且只初始化一次 。
函数static变量(局部static变量)在函数中有效,第一次进入函数初始化并且只初始化一次,以后进入函数将沿用上一次的值。
2、生存期生存期都是从main第一次执行,直到程序结束。
3、作用域
如果在{}中定义了static变量,则其作用域为{}内(针对的是局部static变量),出了{},程序会指示相应的static变量未定义。如果将static变量定义为全局的。则其拥有文件作用域,只在声明的文件中有效,其他源文件中不可见。
#include<iostream>
using namespace std;
int main(void)
{
for(int i = 0;i < 5;i++)
{
static int m = 7;
cout<<"m="<<m--;
}
cout<<m<<endl;//这里会显示错误
return 0;
}
四、全局变量和static全局变量的关系
全局static变量的初始化在编译的时候进行。在main函数被调用之前初始化并且只初始化一次 。
普通全局变量前面加上static 就成了static全局变量,他们的存储方式都是一样,存在静态存储区(全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区)。区别在于作用范围,普通全局变量作用域是整个源程序,当一个程序有多个源文件组成时候,普通全局变量在每个源文件中都是有效的,而静态全局变量则限制了作用域,只在定义该变量的源文件中有效。在同一个源程序中的其他源文件不能使用。由于静态全局变量的作用域限于一个源文件内,只能为该源文件内的函数公用,
因此可以避免在其它源文件中引起错误。
注释:static变量和全局变量默认初始化为0。因为它们都存储在静态数据区。在静态数据区,内存中所有的字节默认值都是0x00。static变量不管是局部还是全局的,虽然只可以初始化一次,但是可以赋值,对于全局的static变量只能赋值(在调用的相应函数中)。