static变量的初始化和赋值的区别

来源:互联网 发布:淘宝网中老年女装棉衣 编辑:程序博客网 时间:2024/06/07 15:02

转载:http://blog.csdn.net/petersmart123/article/details/52372754

事实胜于雄辩,啥也别说,code说明问题:

[cpp] view plain copy
 print?
  1. int add(int a, int b)  
  2. {  
  3.     static int result = a + b;  
  4.     return result;  
  5. }  
  6.   
  7. int _tmain(int argc, _TCHAR* argv[])  
  8. {  
  9.     int a = add(2, 1);  
  10.     int b = add(3, 4);  
  11.     if ( a== b)  
  12.         cout << 1 << endl;  
  13.     return 0;  
  14. }  
输出为:1。

稍作修改:

[cpp] view plain copy
 print?
  1. int add(int a, int b)  
  2. {  
  3.     static int result = 0;  
  4.         result = a + b;  
  5.     return result;  
  6. }  
  7.   
  8. int _tmain(int argc, _TCHAR* argv[])  
  9. {  
  10.     int a = add(2, 1);  
  11.     int b = add(3, 4);  
  12.     if ( a== b)  
  13.         cout << 1 << endl;  
  14.     return 0;  
  15. }  
没有任何输出。

这就是static变量的一个性质:初始化只有一次,但是可以多次赋值。在第一段代码中:

[cpp] view plain copy
 print?
  1. static int result = a + b;  
从汇编的调试过程中可以发现只有第一次调用add方法时才进行了初始化,第二次初始化直接跳过了。但是赋值是可以多次的。这也就说明了静态变量的初始化和赋值的区别。

另外,如果上述代码返回引用,并且同时比较二者不使用中间变量呢?如下例:

[cpp] view plain copy
 print?
  1. int& add(int a, int b)  
  2. {  
  3.     static int result = 0;  
  4.     result = a + b;  
  5.     return result;  
  6. }  
  7. int _tmain(int argc, _TCHAR* argv[])  
  8. {  
  9.     //int a = add(2, 1);  
  10.     //int b = add(3, 4);  
  11.     if (add(2, 1) == add(3, 4))  
  12.         cout << 1 << endl;  
  13.     return 0;  
  14. }  
输出结果为:1

[plain] view plain copy
 print?
  1. 00313C7E  push        1    
  2. 00313C80  push        2    
  3. 00313C82  call        add (0311451h)    
  4. 00313C87  add         esp,8    
  5. 00313C8A  mov         esi,eax    
  6. 00313C8C  push        4    
  7. 00313C8E  push        3    
  8. 00313C90  call        add (0311451h)    
  9. 00313C95  add         esp,8    
  10. 00313C98  mov         ecx,dword ptr [esi]    
  11. 00313C9A  cmp         ecx,dword ptr [eax]    
  12. 00313C9C  jne         wmain+6Bh (0313CCBh)  
从下面比较的汇编看来,其实二者比较的是同一地址的数据,所以必然相等。
[plain] view plain copy
 print?
  1. <pre name="code" class="plain">00313C9A  cmp         ecx,dword ptr [eax]   
阅读全文
0 0
原创粉丝点击