static變數的初始化和賦值的區別
阿新 • • 發佈:2019-02-05
事實勝於雄辯,啥也別說,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]