学习记录——变量的作用域和生存期

一、作用域和生存期的定义

作用域:该变量有效的代码作用范围
生存期:变量值在内存中的生存时间,即从创建到销毁的时间段

二、思维导图

在这里插入图片描述
在这里插入图片描述

三、作用域

按变量的作用域分为:

(1)局部变量
(2)全局变量

1、局部变量:

  • 函数内部定义的变量只在本函数范围内有效;
  • 复合语句内定义的变量只在本复合语句范围内有效 ;
  • 在函数声明中出现的参数名,其作用范围只在本行的括号内。
    分为:
    (1)自动变量(auto)
    (2)寄存器变量(register)
    (3)静态局部变量
1  #include<iostream>
2  using namespace std;
3  int main( )
4  {
5  int MAX(int a, int b);//此行为函数声明,所以a与b的作用范围只在本行的括号内
6  cout<<MAX(3,4);
7  return 0;
8  }
9  int MAX(int a,int b){  //a、b的作用域为9-14行
10 int max;               //max的作用域为10-14行
11 if(a>b){ max=a;}
12 else {max=b;}
13 return max;
14 }

2、全局变量:

  • 函数外部定义的变量称为外部变量,也称全局变量。
  • 有效范围为从定义变量的位置开始到本源文件结束;
  • 局部变量和全局变量同名时,局部变量屏蔽全局变量。也就是说,局部变量的作用域部分覆盖全局变量的作用域
1  int a = 3, b = 4;  //a、b为全局变量,它们的作用域为1-10行
2  int MAX(int x, int y) {  //x,y为局部变量,作用域为2-4行
3    return x > y ? x : y;
4  }
5  int main()
6  {
7    int a = 5; //a为局部变量,但与全局变量a同名,因此会覆盖掉全局变量,a值为5
8    cout << MAX(a, b);
9        return 0;
10  }
(1)全局变量(函数)的扩展(extern)
  • 在文件内扩展全局变量的作用域:
    如果文件内用extern对全局变量作声明,作用域可扩展到:从声明处起,到本文件结束
    全局变量作用域扩展后称之为外部变量
    函数作用域扩展后称之为外部函数
1   int main()
2 {
3   extern int a,b; //扩展后作用域变成了3-10
                   //这是声明不是定义,声明a是一个已定义的外部变量     
4   cout << MAX(a, b);
5  }
6   int a = 3, b = 4;  //扩展前a、b的作用域只在6-10
7   int MAX(int x, int y)
8  {
9     return x > y ? x : y;
10  }
  • 全局变量的作用域扩展到其他文件
    在一个文件中定义全局变量,在另一文件中用extern对该全局变量进行声明,可以将全局变量的作用域: 从一个文件中扩展到另一文件中,全局变量作用域扩展后,称之为外部变量;
-file1.cpp
 int a=3,b=4;
-file2.cpp
extern int a,b; //扩展后,a、b所被赋予的值是file1中定义的赋值
int main()
{
cout<<a<<","<<b; 
}
(2)全局变量(函数)的限制(static)
  • 定义全局变量时加 static 声可以限制它的扩展作用域;
    全局变量作用域限制后称之为静态全局变量
    函数作用域限制后称之为内部函数或静态函数
-file1.cpp
 static int a=3,b=4; //限制后,file2即使扩展也无法 调用file1中的a、b
-file2.cpp
extern int a,b; 
int main()
{
cout<<a<<","<<b; //无值,无法输出
}

四、生存期

变量的存储类别决定变量的生存期:
(1)静态存储变量:指在程序运行期间由系统分配固定的存储空间
(2)动态存储变量:在程序运行期间根据需要进行动态的分配存储空间

五、存储区

用户使用的存储区分为:

1、程序区

2、动态存储区:

  • 生存期:函数调用开始时分配存储空间,函数结束时释放。分配和释放是动态的
  • 自动变量寄存器变量 存储在动态存储区
(1)自动变量(auto)

自动变量用auto声明;因为局部变量默认为自动变量;因此,auto 可以省略。

auto int a=3,b=4; //这两行效果是一样的,auto一般可以省略
int a=3,b=4;
(2)寄存器变量(register)

为了提高效率,允许将局部变量的值放在 CPU中的寄存器中,这种变量叫寄存器变量,用关键字 register 作声明

 register int a,b=4;

注意:计算机系统中的寄存器数目有限,如果定义过多,系统则将其定义为自动变量使用。 同样,编译器可能将自动变量定义为寄存器变量加快运算速度,因此寄存器变量一般用户很少会使用

3、 静态存储区:

  • 生存期:程序开始执行时分配存储空间,程序执行完毕释放,占固定的存储空间
  • 静态局部变量全局变量 存储在静态存储区
(1)静态局部变量(static)

如果需要函数中的局部变量的值在函数调用结束后不消失而保留前一次调用后留下来的值;这时就应该指定局部变量为静态局部变量,用关键字 static 进行声明

//例如,用static定义一个变量用于计算阶乘
int fac(int n){
static int i=1; 
i*=n;
return i;
}
int main()
{
  forint j=1;j<=5;j++){
        cout<<j<<"!="<<fac(j)<<endl;
   }
}
  • 34
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值