C++ 全局变量和全局静态变量有什么区别呢?(小知识:对变量和常量的认识)

 

C++全局变量与全局静态变量:

<em><strong><span style="color:#ff0000">C++ 全局变量和全局静态变量的根本区别还是作用域的区别</span></strong></em>
1.全局变量是不显示用static修饰的全局变量,但全局变量默认是静态的,作用域是整个工程,在一个文件内定义的全局变量,在另一个文件中,通过extern 全局变量名的声明,
 就可以使用全局变量;
2.全局静态变量是显示用static修饰的全局变量,作用域是所在的文件,其他的文件即使用extern声明也不能使用。
3.全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无
不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限
制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公
用, 因此可以避免在其它源文件中引起错误。所以把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。
 
1. 全局变量的作用域是整个项目,它只需要在一个源文件中定义就可以作用于所有的源文件,其它不包括全局变量定义的文件需要用extern关键字再次声明这个全局变量。 2. 全局变量、静态全局变量、静态局部变量都是在静态存储区(全局数据区)中分配空间的,而局部变量是在栈上分配空间的。 3. 全局变量、静态变量的生命期和程序生命期是一样的,在程序结束之后操作系统会回收空间。 4. 全局变量和静态变量都是保存在静态存储区中,生命期和程序一样,但是不同的是全局变量的作用域是整个项目,而静态全局变量是当前程序文件,静态局部变量则是当前函数体内。 全局变量和静态全局变量、静态局部变量默认值都是0,也就是在没有初始化变量值的时候默认为0。 5. 静态变量包含静态局部变量和静态全局变量。 静态局部变量具有局部作用域只对定义自己的函数可见,只被初始化一次,自从初始化一次之后直到程序运行期间一直都在。 静态全局变量具有全局作用域作用于定义它的程序文件但是不能作用于项目里的其它文件,这一点和全局变量不同。静态全局变量可以被多次初始化。 6. 把局部变量改变为静态变量之后是改变了它的存储方式和生命期。 把全局变量改变为静态变量之后是改变了它的作用域,限制了使用范围 7. 看以下几个例子 例子:测试静态局部变量  int Fun(void)操作系统会回收空间。 4. 全局变量和静态变量都是保存在静态存储区中,生命期和程序一样,但是不同的是全局变量的作用域是整个项目,而静态全局变量是当前程序文件,静态局部变量则是当前函数体内。 全局变量和静态全局变量、静态局部变量默认值都是0,也就是在没有初始化变量值的时候默认为0。 5. 静态变量包含静态局部变量和静态全局变量。 静态局部变量具有局部作用域只对定义自己的函数可见,只被初始化一次,自从初始化一次之后直到程序运行期间一直都在。 静态全局变量具有全局作用域作用于定义它的程序文件但是不能作用于项目里的其它文件,这一点和全局变量不同。静态全局变量可以被多次初始化。 6. 把局部变量改变为静态变量之后是改变了它的存储方式和生命期。 把全局变量改变为静态变量之后是改变了它的作用域,限制了使用范围 7. 看以下几个例子 例子:测试静态局部变量  int Fun(void)
  { 
    	//声明一个静态局部变量
	static int num = 0;
	++num;
	return num;
   }
       for(int i = 0; i < 10; i++)	//声明一个静态局部变量
	static int num = 0;
	++num;
	return num;
   }
       for(int i = 0; i < 10; i++)
  {
       cout<<Fun()<<" ";
  }
/*
输出结果是
1 2 3 4 5 6 7 8 9 10
*/
/*解释如下
1. 静态局部变量只会被初始化一次,因此第一次调用Fun函数的时候num被初始化为0
2. 然后每次调用的时候++num,第一次调用++num为1;第二次++num为2......
3. 静态局部变量的生命期是整个程序因此值可以保存下来*/
 //声明一个静态全部变量
static int value;

//测试静态全局变量
void G(void)解释如下
1. 静态局部变量只会被初始化一次,因此第一次调用Fun函数的时候num被初始化为0
2. 然后每次调用的时候++num,第一次调用++num为1;第二次++num为2......
3. 静态局部变量的生命期是整个程序因此值可以保存下来*/
 //声明一个静态全部变量
static int value;

//测试静态全局变量
void G(void)
 {
    value = 0;
    ++value;
 }

for(int i = 0; i < 10; i++){
    G();
    cout<<value<<" ";
}
/*
输出1 1 1 1 1 1 1 1 1 1
解释
1. 静态全局变量可以被初始化多次,因为每次调用G函数都会对静态全局变量初始化为0
2. 每次value的值都初始化为0,++value为1,因此输出的值为1
*/
//测试静态局部变量
int Get(int x)
{
    static int count = x;
	return count+x;
}
printf("%d %d\n", Get(4), Get(5));
/*
输出9 10
解释:
1.printf是一个函数,根据函数参数入栈的顺序是从右到左,则先调用Get(5)再调用Get(4)
2.调用Get(5)的时候,count第一次被初始化为5,则返回10;第二次调用Get(4)的时候count不再被初始化值为5返回9
*/

<img id="currentImg" data-cke-saved-src="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1511022855516&di=7e070e7ea0987556ba0675d6145088fb&imgtype=0&src=http%3A%2F%2Fimg.sucai.redocn.com%2Fattachments%2Fimages%2F201012%2F20101206%2F20101205_172d8cc1d8e717623d7cj8Ftg6eLZ2Aw.jpg" src="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1511022855516&di=7e070e7ea0987556ba0675d6145088fb&imgtype=0&src=http%3A%2F%2Fimg.sucai.redocn.com%2Fattachments%2Fimages%2F201012%2F20101206%2F20101205_172d8cc1d8e717623d7cj8Ftg6eLZ2Aw.jpg" width="490" height="340" alt="" class="currentImg" />

对变量和常量的认识:

我认为,常量在编程中用的最多的的是数字,理由这是非常简单的,因为数字就是数字,它是不能改变的,例如:1就是1,2就是2,等等等等······
变量在编程中相对来说是字母,例如:int a=12;b=13;a=b;经过这一赋值的操作,结果变为a=13,b=13。以我的观点来看这一过程为a=12的初始化被下面的a=b覆盖了。
具体在程序中为:
#include<iostream>
using namespace std;
int main()
{
	int a,b;
	a=12;
	b=13;
	a=b;
	cout<<"a= "<<a<<"\t"<<"b= "<<b<<endl;
}
	int a,b;
	a=12;
	b=13;
	a=b;
	cout<<"a= "<<a<<"\t"<<"b= "<<b<<endl;
}
/* 输出的结果为:a=13 b=13.



  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值