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

本文详细解析了不同类型的变量,包括普通全局变量、局部变量、static局部变量、static全局变量等的概念及用法,阐述了它们之间的区别。

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


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

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值