普通局部变量、普通全局变量、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变量只能赋值(在调用的相应函数中)。
- 普通局部变量、普通全局变量、static局部变量、static全局变量
- static全局变量,static局部变量,static函数与全局变量,局部变量,普通函数的区别
- static全局变量与普通全局变量/static局部变量与普通局部变量/static函数与普通函数的区别
- static全局变量与普通的全局变量、static局部变量和普通局部变量、static函数与普通函数的区别
- static全局变量与普通全局变量区别?static局部变量与普通局部变量区别?static函数与普通函数区别?
- static全局变量和普通全局变量区别?static局部变量和普通局部变量区别?static函数和普通函数区别
- static全局变量,局部变量,函数与普通全局变量,局部变量和函数的区别
- static全局变量,局部变量,函数与普通全局变量,局部变量和函数的区别
- static全局变量,局部变量,函数与普通全局变量,局部变量和函数的区别
- static 全局变量 全局变量 静态局部变量 局部变量 静态函数 普通函数 之间的区别
- static全局变量与普通的全局变量和普通局部变量的区别,static函数与普通函数的区别
- static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?
- static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?
- static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?
- static 全局变量与普通的全局变量的区别/static局部变量和普通局部变量的区别/static函数与普通函数的区别[转]
- static全局变量与普通的全局变量的区别/static局部变量和普通局部变量的区别/static函数与普通函数的区别
- static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?
- static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?
- 子线程循环 10 次,接着主线程循环 100 次
- [改]linux之chmod
- 计算出他们之间所有整数的和
- 幼儿园幼儿毕业感言
- Utf-8编码处理(解决c++/MFC下的乱码问题)
- 普通局部变量、普通全局变量、static局部变量、static全局变量
- AIX环境C/S架构Java工程利用Jprofiler工具排查内存溢出错误
- STL源码:空间配置器(三)内存的配置和释放、SGI的两级适配器
- (hdu 简单题 128道)hdu 2003 求绝对值
- PPT在线转换为PDF转换器
- Make 命令教程
- Mac OSX安装Git
- java 线程让步(yield)
- 对系统图片进行放大或者缩小