自动变量

计算机编程领域,自动变量Automatic Variable)指的是局部作用域变量,具体来说即是在控制流进入变量作用域时系统自动为其分配存储空间,并在离开作用域时释放空间的一类变量。在许多程序语言中,自动变量与术语“局部变量”(Local Variable)所指的变量实际上是同一种变量,所以通常情况下“自动变量”与“局部变量”是同义的。

不同程序语言中的实现

CC++

自动变量在C与C++中的实现即为“自动变量”(Automatic Variable)。默认情况下,在代码块内声明的变量都是自动变量,但亦可用自动变量的关键字auto明确标识存储类[1];而如若使用register(而非auto)存储类标识代码块内的变量,编译器就会将变量缓存处理器内的寄存器中,此种情况下不能对该变量或其成员变量使用引用操作符&以获取其地址,因为&只能获取内存空间中的地址;除此以外,由于寄存器的数量及其所能存储的数据类型硬件限制而可能无法存储指定变量,编译器可以忽略声明内的register关键字。对于一个未初始化的自动变量来说,在为其赋值之前其值都为undefined(未定义)[2]

在C++中,如谚语“资源获取即初始化”(Resource Acquisition Is Initialization,常缩写为RAII)所述,自动变量的构造函数在程序运行至声明部分的时候才会被调用,而当程序运行至所给的程序块末端的时候则调用析构函数,这一特性常应用于资源的分配与释放管理,如自动关闭已开启的文件或自动释放空闲内存。

自动变量在Java中的实现为“局部变量”(Local Variable)。Java中的自动变量与C、C++中的相似,但Java中并无auto、register这些标识存储类用的关键字。但相对应的,Java编译器亦不允许使用没有明确初始化的局部变量(会提示错误),这一点与C、C++不同,在C与C++中编译器只会对这类用法做出警告。根据Java标准的要求,每个局部变量在使用之前都必须明确地初始化[3],从这点来说Java中的局部变量与可以默认值(数值变量对应0,对象对应null[4])进行隐式初始化的实例变量是有所差异的。

自动变量在C与C++中的实现则为词法变量(Lexical)、my/私有变量(Private Variable)。在Perl中,局部变量是以操作符my声明的。未初始化的数据项的默认初值是undef,而未初始化的数组散列的默认初值则为()。Perl中亦可用local操作符将全局变量临时用作自动变量,也即在不创建自动变量的情况下给一个全局变量(亦称包变量)临时赋值(原值则先保存于别处)并将其作用域限定在代码块内,当执行到变量的作用域之外时再恢复原值[5]

参考

  1. ^ 在C++当前的C++11标准中,关键字auto亦可用于对未标明类型的变量进行类型推断
  2. ^ 当前 C语言标准文档PDF (3.61MiB): section 6.2.4, Storage durations of objects(英文)
  3. ^ 4.12.5 Initial Values of Variables. Sun Microsystems. [2008-10-17]. (原始内容存档于2012-09-03). (英文)
  4. ^ Private variables via my() - perlsub - perldoc.perl.org. [2008-10-17]. (原始内容存档于2020-09-21). (英文)
  5. ^ Temporary values via local() - perlsub - perldoc.perl.org. [2011-02-25]. (原始内容存档于2020-09-21). (英文)