### 请举例说出静态变量与非静态变量的主要区别

答案：

1. 静态变量的生命期从其定义开始时直到应用程序的结束。

2. 静态变量只被初始化一次，即在定义时进行初始化。

正是基于这两个原因使得静态变量在函数调用后它的值仍然能够被保留，并且在下次调用函数时使用的是上一次函数调用后的结果。

我们先举一个非静态变量的例子。

void NonStaticDemo()

{

int nIndex = 1;

cout << nIndex << endl;

nIndex++;

}

int main(int argc, char* argv[])

{

for(int i=0; i<5; i++)

{

NonStaticDemo();

}

return 0;

}

效果如图 1 所示。

图 1 非静态变量

从图 1 中可以发现，在 main 函数中 5 次调用 NonStaticDemo 函数，输出的 nIndex 值均为 1。这是因为在调用 NonStaticDemo 函数后，nIndex 的生命期结束了，nIndex 不会保留结果。在开始新的 NonStaticDemo 函数调用时，nIndex 又重新被初始化为 1。因为，5 次调用 NonStaticDemo 函数输出的结果均为 1。

下面我们再举一个静态变量的例子。

void StaticDemo()

{

static int s_nIndex = 1;

cout << s_nIndex << endl;

s_nIndex++;

}

int main(int argc, char* argv[])

{

for(int i=0; i<5; i++)

{

StaticDemo();

}

return 0;

}

执行效果如图 2 所示。

图 2 静态变量

从图 2 中可以发现，在 main 函数中 5 次调用 StaticDemo 函数，输出的 s_nIndex 值均不同，分别为 1、2、3、4、5。因为在 StaticDemo 函数中，s_nIndex 是静态变量，无论函数 StaticDemo 调用多少次，s_nIndex 只被初始化一次，即“static int s_nIndex = 1;”语句只被执行一次。并且在 StaticDemo 函数调用后，s_nIndex 的生命期并没有结束，它仍然保留上一次的结果。因此，每次调用 StaticDemo 函数时输出的 s_nIndex 值均不同。