普通局部变量、普通全局变量、static局部变量、static全局变量

来源:互联网 发布:直播间人气软件 编辑:程序博客网 时间:2024/04/29 17:53

一、普通全局变量和普通局部变量的关系


通常情况下,如果有两个同名变量,一个是普通全局变量,另一个是普通局部变量,那么局部变量在其作用域内具有较高的优先权,它将屏蔽全局变量。

#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; //输出6return 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变量只能赋值(在调用的相应函数中)。



1 0
原创粉丝点击