C++經典問題 之++/- -

原文 http://www.cnblogs.com/alex-tech/archive/2011/03/27/1997075.html

1) 在計算中,對於一個作用域內的前綴操作數(++i),替換爲i的最終數值,對於後綴操作符替換爲原數值。

2) 在printf,cout等依靠堆棧工作的方法中,對於一個作用域內的前綴操作符(++i),替換爲i的最終數值,對於後綴操作符,按照入棧順序分析。

 

  1.  1:      int a ;  
  2.  2:      //------------------------------------------------------------------------------------ 
  3.  3:      // 以下部分, 不含有前綴操作符, 首先是後面的a++入棧1,a=2,後是第一個a++入棧2 
  4.  4:      a = 1; 
  5.  5:      cout<<"a  "<<a++<<"  "<<a++<<endl; //2,1 
  6.  6:      cout<<"a  "<<a<<endl;              //3 
  7.  7:      a = 1; 
  8.  8:      printf("a  %d  %d\n",a++,a++);     //2,1 
  9.  9:      printf("a  %d\n",a);               //3 
  10.  10:    
  11.  11:      //------------------------------------------------------------------------------------ 
  12.  12:      // 以下部分, 含有前綴操作符,計算a的最終數值爲3 首先是++a入棧爲3,之後是++a入棧爲3 
  13.  13:      a = 1; 
  14.  14:      cout<<"a  "<<++a<<"  "<<++a<<endl; //3,3 
  15.  15:      cout<<"b  "<<a<<endl;              //3 
  16.  16:      a = 1; 
  17.  17:      printf("a  %d  %d\n",++a,++a);     //3,3 
  18.  18:      printf("a  %d\n",a);               //3 
  19.  19:    
  20.  20:      //------------------------------------------------------------------------------------ 
  21.  21:      // 以下部分, 含有前綴操作符, 計算a的最終數值爲3,首先是++a入棧爲3,a=2之後是a++入棧爲2 
  22.  22:      a = 1; 
  23.  23:      cout<<"a  "<<a++<<"  "<<++a<<endl; //2,3 
  24.  24:      cout<<"a  "<<a<<endl;              //3 
  25.  25:      a = 1; 
  26.  26:      printf("a  %d  %d\n",a++,++a);     //2,3 
  27.  27:      printf("a  %d\n",a);               //3 
  28.  28:    
  29.  29:      //------------------------------------------------------------------------------------ 
  30.  30:      // 以下部分, 含有前綴操作符, 計算a的最終數值爲3,首先是a++入棧爲1,a=2之後是++a入棧爲3 
  31.  31:      a = 1; 
  32.  32:      cout<<"a  "<<++a<<"  "<<a++<<endl; //3,1 
  33.  33:      cout<<"a  "<<a<<endl;              //3 
  34.  34:      a = 1; 
  35.  35:      printf("a  %d  %d\n",++a,a++);     //3,1 
  36.  36:      printf("a  %d\n",a);               //3 
  37.  37:    
  38.  38:      int b; 
  39.  39:      a = 1; 
  40.  40:      b = 1; 
  41.  41:      // 左右操作符號都是b++,不含有前綴操作符,則左右操作數都替換爲1,a=1+1=2 
  42.  42:      a = (b++)+(b++); 
  43.  43:      printf("a = (b++)+(b++)  %d %d\n",a,b);//2,3 
  44.  44:      a = 1; 
  45.  45:      b = 1; 
  46.  46:      // 含有前綴操作符,前綴操作符替換爲3,a=3+3=6 
  47.  47:      a = (++b)+(++b); 
  48.  48:      printf("a = (++b)+(++b)  %d %d\n",a,b);//6,3 
  49.  49:      a = 1; 
  50.  50:      b = 1; 
  51.  51:      // 由於含有前綴操作符,則含前綴操作符的部分替換爲3,含後綴操作符的還是原數值,a=3+1=4 
  52.  52:      a = (++b)+(b++); 
  53.  53:      printf("a = (++b)+(b++)  %d %d\n",a,b);//4,3 
  54.  54:    
  55.  55:      a = 1; 
  56.  56:      b = 1; 
  57.  57:      // 由於含有前綴操作符,則含前綴操作符的部分替換爲6,含後綴操作符的還是原數值1,a=6+6+6+1+1=20 
  58.  58:      a = (++b)+(++b)+(++b)+(b++)+(b++); 
  59.  59:      printf(" a = (++b)+(++b)+(++b)+(b--)  %d %d\n",a,b); //20,6 

  而對於重載的++、--操作符,情況類似,如下例子,注意第22行代碼:

 

  1.  1:  class Example{ 
  2.  2:  public
  3.  3:  Example(int i,int j) { _x = i; _y = j;} 
  4.  4:  // 前綴形式(++i)重載的時候沒有虛參,通過引用返回*this,也就是返回變化之後的數值 
  5.  5:  const Example& Example::operator++ () { 
  6.  6:            ++_x; 
  7.  7:            ++_y; 
  8.  8:            return *this
  9.  9:  } 
  10.  10:  // 後綴形式(i++)重載的時候有一個int類型的虛參, 返回原狀態的拷貝 
  11.  11:  const Example Example::operator++ (int) { 
  12.  12:              Example tmp(*this); 
  13.  13:              ++_x; 
  14.  14:              ++_y; 
  15.  15:              return tmp;     
  16.  16:  } 
  17.  17:  int _x, _y;         
  18.  18:  }; 
  19.  19:  Example ei(1,2); 
  20.  20:  cout<<"ei "<<(ei++)._x<<"  "<<ei._y<<endl;  // 1,2  ei++的時候,返回的是ei原狀態的拷貝,此時原ei的狀態已經更新 
  21.  21:  cout<<"ei "<<(ei)._x<<"  "<<ei._y<<endl;    // 2,3  ei的狀態已經更新,_x = 2, _y = 3 
  22.  22:  cout<<"ei "<<(++ei)._x<<"  "<<ei._y<<endl;  // 3,3  首先是ei._y入棧,此時ei尚未更新,入棧爲3,之後入棧(++ei)._x,ei已經更新,入棧爲3 
  23.  23:  cout<<"ei "<<(ei)._x<<"  "<<ei._y<<endl;    // 3,4  ++ei的時候,ei已經更新,_x = 3, _y = 4; 
  24.  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章