作用域与生存期
在《程序设计语言原理》(第8版)中,作者这样描述作用域和生存期这两个经常搅在一起的概念。
有时,变量的作用域与生存期似乎是相关的。例如,考虑一个在不包含方法调用的Java方法中声明的变量。这个变量的作用域是从它的声明到这个方法的结尾。它的生存期开始于方法进入之时,终止于方法执行完毕之时。虽然变量的作用域与生存期显然不是同一件事情:静态作用域是文本或空间的概念,而生存期是时间的概念,但至少在这个情形下似乎是相关的。
作用域和生存期之间这种表面上的关系在其他情况下并不存在。例如,在C和C++中,一个函数中由修饰符static声明的变量被静态地绑定于函数的作用域,同时也被静态地绑定于存储空间。所以这个变量的作用域是静态的,并且对于这个函数来说是局部的,但它的生存期却扩展到了整个程序执行期间。
当涉及到子程序调用时,作用域和生存期也是无关的。考虑下面这些C++函数:
void printheader() {
...
} /*printheader 结束*/
void compute() {
int sum;
...
printheader();
}
变量sum的作用域完全包含在函数compute之中。尽管printheader在函数compute的运行中间执行,但sum的作用域却没有扩展到printheader函数体中。然而,sum的生存期则被扩展到了printheader执行的整个期间。在printheader被调用之前,无论将变量sum绑定于什么存储空间,这种绑定在printheader的执行中间以及执行之后都将继续。