2010-07-28 169 views
4

今天我遇到了一個有趣的問題。看看這個僞代碼:C++中的靜態變量

void Loop() 
{ 
    static int x = 1; 
    printf("%d", x); 
    x++; 
} 

void main(void) 
{ 
    while(true) 
    { 
     Loop(); 
    } 
} 

即使x是靜態的,爲什麼這個代碼每次都不打印「1」?在我打印之前,我在每次迭代時都將x重新初始化爲1。但無論出於何種原因,x按預期遞增。

+3

爲什麼不讀一本關於C++(或C)的書來找出答案? – 2010-07-28 15:55:29

回答

9

靜態變量的初始化只發生在第一次。之後,實例將在所有對該函數的調用中共享。

1

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將增加預期,因爲該值留存

3

我在每個迭代上

不,你不重新初始化x到1:你初始化它爲1,但它只能被初始化一次。

1

靜態在這種情況下意味着值之間應該保留之間的函數調用。初始化只完成一次。