变量

119 阅读4分钟

变量

局部变量

  1. 在函数内部或复合语句中(区域)定义的变量,称为局部变量,又称为内部变量

  2. 函数内部定义的变量、函数的形式参数、某个语句中定义的变量都是局部变量

  3. 局部变量只能在定义区域和其子区域中使用

  4. 在同一个区域中不能定义相同名字的变量

  5. 在不同区域中允许定义相同名字的变量,但本质上他们是不同的变量

  6. 如果一个变量所处区域的子区域中有同名的变量,则该变量在子区域内无效,有效的是子区域的变量,称为定义屏蔽

全局变量

  1. 在函数外部定义的变量,称为全局变量

  2. 全局变量的有效区域是从定义变量的位置开始到源文件结束,在整个项目工程下都可用

  3. 提倡少用或不用全局变量

作用域

  1. c++的实体有三类:

    1. 变量或对象(变量、数组)
    2. 函数
    3. 类型(结构体类型、共用体类型、类类型)
  2. 作用域是程序中的一段区域,在同一个作用域上,一个名字只能与唯一实体相对应;在不同作用域上,一个名字可以与不同作用域中的不同实体相对应

  3. 作用域有:

    1. 文件作用域
    2. 函数作用域
    3. 块作用域
    4. 类型声明作用域
    5. 函数原型作用域
  4. 实体在作用域内可以使用称为可见,又称有效

  5. 可见规则:

    1. 同一个作用域内不允许有相同名字的实体,不同作用域可以有相同名字
    2. 实体在包含它的作用域内,从定义或声明的位置开始,按文件行的顺序往下直到该作用域结束均是可见的,包含作用域内所有子区域及其嵌套
    3. 若实体A在包含它的作用域内的子区域中出现了相同的实体B,则实体A被屏蔽
    4. 可以使用extern声明将变量或函数实体的可见区域往前延伸,称为前置声明,也可扩展到同个项目工程下的其他文件
      extern 类型 变量名,···
      extern 返回类型 函数名(类型1 参数名1,···)
      extern 返回类型 函数名(类型1,···)
      
    5. 在全局作用域中,变量或函数实体若使用static修饰,则该实体对于其他源文件是屏蔽的,称为私有的
      static 类型 变量名,···
      static 返回类型 函数名(类型1 参数名1,···)
      static 返回类型 函数名(类型1,···)
      

生命期

  1. 每个名字都有作用域,即可以使用名字的区域,而每个对象都有生命期,即程序执行过程中对象存在的时间

  2. 动态存储是指在程序运行期间,系统为对象动态地分配存储空间,动态存储的存储空间的分配和释放是动态的,生命期是整个程序运行的一部分,它的对象不持久地占有存储空间

  3. 动态存储在分配和释放的形式有两种:

    1. 由函数调用来自动完成的,称为自动存储
    2. 由指令方式人工完成的,称为自由存储
  4. 静态存储是指对象在整个程序运行期持久占有存储空间,其生命期与程序运行期相同

  5. 静态存储的对象数据可以在程序运行期始终保持直到修改为止,或者程序结束为止,静态存储的分配和释放在编译完成时就决定好了

  6. 尽量少用静态存储

  7. 自动对象:默认情况下,函数或复合语句中的对象(包含形参)称为自动对象,存储方式是自动存储

    (auto) 类型 变量名,······

  8. 寄存器变量:用CPU的寄存器来存放局部变量,称为寄存器变量

    register 类型 变量名,······

  9. 静态局部对象:在局部变量前面加上static存储类别修饰用来指明对象是静态局部对象,静态局部变量会保留其值,属于静态存储

    static 类型 变量名,······

  10. 函数本质上是全局(外部)的,在函数前面加上static修饰使其称为内部函数,加上extern修饰即为外部函数,extern可以省略