今天我遇到了一個有趣的問題。看看這個僞代碼:C++中的靜態變量
void Loop()
{
static int x = 1;
printf("%d", x);
x++;
}
void main(void)
{
while(true)
{
Loop();
}
}
即使x是靜態的,爲什麼這個代碼每次都不打印「1」?在我打印之前,我在每次迭代時都將x重新初始化爲1。但無論出於何種原因,x按預期遞增。
今天我遇到了一個有趣的問題。看看這個僞代碼:C++中的靜態變量
void Loop()
{
static int x = 1;
printf("%d", x);
x++;
}
void main(void)
{
while(true)
{
Loop();
}
}
即使x是靜態的,爲什麼這個代碼每次都不打印「1」?在我打印之前,我在每次迭代時都將x重新初始化爲1。但無論出於何種原因,x按預期遞增。
靜態變量的初始化只發生在第一次。之後,實例將在所有對該函數的調用中共享。
static
並不意味着const
。
從MSDN:
當修改一個變量,靜態 關鍵字指定可變 具有靜態的持續時間(其被分配 在程序開始時和 解除分配時,程序結束)和 將其初始化爲0,除非指定了另一個 值。當修改在文件範圍一個 變量或函數, 靜態關鍵字指定的 變量或函數具有內部 鍵(它的名字從 是不可見的,其中它被 聲明的文件之外)。
在 函數中聲明爲靜態的變量保留其在 之間的狀態調用該函數。
當在 類聲明修改的數據成員,關鍵字static 指定該構件 的一個副本被 類的所有實例共享。當在類聲明中修改成員 函數時,關鍵字 指定 函數僅訪問靜態成員。
靜態的值會保留每個函數調用之間,因此,例如(從MSDN再次):
// static1.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
void showstat(int curr) {
static int nStatic; // Value of nStatic is retained
// between each function call
nStatic += curr;
cout << "nStatic is " << nStatic << endl;
}
int main() {
for (int i = 0; i < 5; i++)
showstat(i);
}
在你的榜樣,x將增加預期,因爲該值留存。
我在每個迭代上
不,你不重新初始化x到1:你初始化它爲1,但它只能被初始化一次。
靜態在這種情況下意味着值之間應該保留之間的函數調用。初始化只完成一次。
爲什麼不讀一本關於C++(或C)的書來找出答案? – 2010-07-28 15:55:29