1. 程式人生 > >static變數的初始化和賦值的區別

static變數的初始化和賦值的區別

事實勝於雄辯,啥也別說,code說明問題:

int add(int a, int b)  
{  
    static int result = a + b;  
    return result;  
}  

int _tmain(int argc, _TCHAR* argv[])  
{  
    int a = add(2, 1);  
    int b = add(3, 4);  
    if ( a== b)  
        cout << 1 << endl;  
    return 0;  
}  

輸出為:1。
稍作修改:

int add
(int a, int b) { static int result = 0; result = a + b; return result; } int _tmain(int argc, _TCHAR* argv[]) { int a = add(2, 1); int b = add(3, 4); if ( a== b) cout << 1 << endl; return 0; }

沒有任何輸出。
這就是static變數的一個性質:
初始化只有一次,但是可以多次賦值。

在第一段程式碼中:

static int result = a + b;  

從彙編的除錯過程中可以發現只有第一次呼叫add方法時才進行了初始化,第二次初始化直接跳過了。但是賦值是可以多次的。這也就說明了靜態變數的初始化和賦值的區別。
另外,如果上述程式碼返回引用,並且同時比較二者不使用中間變數呢?如下例:

int& add(int a, int b)  
{  
    static int result = 0;  
    result = a + b;  
    return result;  
}  
int _tmain(int argc, _TCHAR* argv[])  
{  
    //int a = add(2, 1);  
//int b = add(3, 4); if (add(2, 1) == add(3, 4)) cout << 1 << endl; return 0; }

輸出結果為:1

00313C7E  push        1    
00313C80  push        2    
00313C82  call        add (0311451h)    
00313C87  add         esp,8    
00313C8A  mov         esi,eax    
00313C8C  push        4    
00313C8E  push        3    
00313C90  call        add (0311451h)    
00313C95  add         esp,8    
00313C98  mov         ecx,dword ptr [esi]    
00313C9A  cmp         ecx,dword ptr [eax]    
00313C9C  jne         wmain+6Bh (0313CCBh)  

從下面比較的彙編看來,其實二者比較的是同一地址的資料,所以必然相等。

00313C9A  cmp         ecx,dword ptr [eax]