转载:http://blog.youkuaiyun.com/petersmart123/article/details/52372754
事实胜于雄辩,啥也别说,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[])
- {
-
-
- 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)
从下面比较的汇编看来,其实二者比较的是同一地址的数据,所以必然相等。
- <pre name="code" class="plain">00313C9A cmp ecx,dword ptr [eax]