在
计算机编程领域,自动变量(Automatic Variable)指的是局部作用域变量,具体来说即是在控制流进入变量作用域时
系统自动为其分配
存储空间,并在离开
作用域时释放空间的一类
变量。
在计算机编程领域,自动变量(Automatic Variable)指的是局部作用域变量,具体来说即是在
控制流进入变量作用域时系统自动为其分配
存储空间,并在离开
作用域时释放空间的一类变量。在许多
程序语言中,自动变量与术语“
局部变量”(Local Variable)所指的变量实际上是同一种变量,所以通常情况下“自动变量”与“局部变量”是同义的。
自动变量在C与C++中的实现即为“自动变量”(Automatic Variable)。默认情况下,在代码块内声明的变量都是自动变量,但亦可用自动变量的关键字auto明确标识
存储类;而如若使用register(而非auto)存储类标识代码块内的变量,
编译器就会将变量
缓存于
处理器内的
寄存器中,此种情况下不能对该变量或其
成员变量使用引用
操作符&以获取其地址,因为&只能获取内存空间中的地址;除此以外,由于寄存器的数量及其所能存储的
数据类型受
硬件限制而可能无法存储指定变量,编译器可以忽略
声明内的register关键字。对于一个未
初始化的自动变量来说,在为其
赋值之前其值都为undefined(未定义)。
在C++中,如谚语“资源获取即初始化”(Resource Acquisition Is Initialization,常缩写为RAII)所述,自动变量的
构造函数在程序运行至声明部分的时候才会被调用,而当程序运行至所给的程序块末端的时候则调用
析构函数,这一特性常应用于资源的分配与释放管理,如自动关闭已开启的
文件或自动释放空闲内存。
自动变量在Java中的实现为“局部变量”(Local Variable)。Java中的自动变量与C、C++中的相似,但Java中并无auto、register这些标识存储类用的关键字。但相对应的,Java编译器亦不允许使用没有明确初始化的局部变量(会提示错误),这一点与C、C++不同,在C与C++中编译器只会对这类用法做出警告。根据Java标准的要求,每个局部变量在使用之前都必须明确地初始化,从这点来说Java中的局部变量与可以默认值(数值变量对应0,对象对应null)进行隐式初始化的实例变量是有所差异的。
自动变量在C与C++中的实现则为词法变量(Lexical)、my/私有变量(Private Variable)。在Perl中,局部变量是以操作符my声明的。未初始化的数据项的默认初值是undef,而未初始化的
数组与
散列的默认初值则为()。Perl中亦可用local操作符将
全局变量临时用作自动变量,也即在不创建自动变量的情况下给一个全局变量(亦称包变量)临时赋值(原值则先保存于别处)并将其作用域限定在代码块内,当执行到变量的作用域之外时再恢复原值。