我在念力上有一些关于static
auto
0local
Variable的信息.
我在某个地方读到,static
变量只能在函数中访问,但在函数返回后它们仍然存在(保留在内存中).
不过,我也知道local
个变量也有同样的作用,那有什么不同呢?
我在念力上有一些关于static
auto
0local
Variable的信息.
我在某个地方读到,static
变量只能在函数中访问,但在函数返回后它们仍然存在(保留在内存中).
不过,我也知道local
个变量也有同样的作用,那有什么不同呢?
这里有两个不同的概念:
Local个变量(圆滑地说,变量为block scope)只能在声明它们的代码的挡路中访问:
void f() {
int i;
i = 1; // OK: in scope
}
void g() {
i = 2; // Error: not in scope
}
Global个变量(按部就班地说,变量带有file scope(在C中)或namespace scope(在C++中))在其声明之后的任何点都可以访问:
int i;
void f() {
i = 1; // OK: in scope
}
void g() {
i = 2; // OK: still in scope
}
(在C++中,情况更为复杂,因为名称空间可以关闭和重新打开,并且可以访问当前范围以外的范围,并且名称也可以具有类范围.但这变得非常离题.)
Automatic个变量(学究地说,是automatic storage duration个变量)是局部变量,其生存期在执行离开其作用域时结束,并在重新进入作用域时重新创建.
for (int i = 0; i < 5; ++i) {
int n = 0;
printf("%d ", ++n); // prints 1 1 1 1 1 - the previous value is lost
}
Static个变量(矫揉造作地说,static storage duration个变量)的生命周期一直持续到程序结束.如果它们是局部变量,那么当执行离开它们的作用域时,它们的值仍然存在.
for (int i = 0; i < 5; ++i) {
static int n = 0;
printf("%d ", ++n); // prints 1 2 3 4 5 - the value persists
}
请注意,除了静态存储持续时间外,static
关键字还有各种含义.在一个全局变量或函数上,它给出internal linkage,这样就无法从其他转换单元访问它;在C++类成员上,它意味着每个类有一个实例,而不是每个对象一个.此外,在C++中,auto
关键字不再意味着自动存储持续时间;它现在的意思是自动类型,从变量的初始化器推导而来.