C ++ Primer说
每个局部静态变量在第一次之前初始化 执行通过对象的定义。当地静力学是 功能结束时不被破坏;他们在节目时被摧毁 终止。
本地静态变量与全局静态变量有什么不同?除了声明它们的位置之外,还有什么不同?
void foo () {
static int x = 0;
++x;
cout << x << endl;
}
int main (int argc, char const *argv[]) {
foo(); // 1
foo(); // 2
foo(); // 3
return 0;
}
与
比较static int x = 0;
void foo () {
++x;
cout << x << endl;
}
int main (int argc, char const *argv[]) {
foo(); // 1
foo(); // 2
foo(); // 3
return 0;
}
答案 0 :(得分:26)
区别在于:
第二个区别对于避免静态初始化顺序惨败非常有用,其中全局变量可以在初始化之前被访问。通过用返回对本地静态变量的引用的函数替换全局变量,可以保证在访问它之前初始化它。 (但是,仍然无法保证在完成访问之前它不会被销毁;如果您认为需要全局可访问的变量,仍需要非常小心。请参阅link的注释以帮助在那种情况下。)
答案 1 :(得分:7)
他们的范围不同。文件中的任何函数都可以访问全局范围的静态变量,而函数范围的变量只能在该函数中访问。
答案 2 :(得分:6)
希望这个例子有助于理解静态局部变量和全局变量之间的区别。
Pattern r = Pattern.compile("\\[\"(.*?)\"\\]");
输出:
#include <iostream>
using namespace std;
static int z = 0;
void method1() {
static int x = 0;
cout << "X : " << ++x << ", Z : " << ++z << endl;
}
void method2() {
int y = 0;
cout << "Y : " << ++y << ", Z : " << ++z << endl;
}
int main() {
method1();
method1();
method1();
method1();
method2();
method2();
method2();
method2();
return 0;
}
答案 3 :(得分:4)
真名是:
static storage duration object.
全局变量也是'静态存储持续时间对象'。与全局变量的主要区别在于:
除此之外,它们就像其他'静态存储持续时间对象'一样。
注意:与所有“静态存储持续时间对象”一样,它们会以创建的相反顺序销毁。
答案 4 :(得分:2)
主要或最严重的区别是初始化时间。本地静态变量在第一次调用函数时初始化,在函数声明它们。在调用main函数之前的某个时间点初始化全局函数,如果你有很少的全局静态变量,它们会以未指定的顺序初始化,这可能会导致问题;这称为静态初始化惨败。
答案 5 :(得分:0)
在你的第一个代码块中,x是foo()函数的本地,这意味着它是在foo()中创建的,并在cout之后的函数末尾被销毁。但是,在第二个块中,x是全局的,这意味着x的范围是整个程序。如果你想在int main下你可以cout&lt;&lt; x&lt;&lt;然而,它将打印出来,在第一个块中它会说x未声明
答案 6 :(得分:0)