程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++經典問題之++/- -

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

編輯:C++入門知識

1) 在計算中,對於一個作用域內的前綴操作數(++i),替換為i的最終數值,對於後綴操作符替換為原數值。
2) 在printf,cout等依靠堆棧工作的方法中,對於一個作用域內的前綴操作符(++i),替換為i的最終數值,對於後綴操作符,按照入棧順序分析。
 
 1:      int a ; 
 2:      //------------------------------------------------------------------------------------
 3:      // 以下部分, 不含有前綴操作符, 首先是後面的a++入棧1,a=2,後是第一個a++入棧2
 4:      a = 1;
 5:      cout<<"a  "<<a++<<"  "<<a++<<endl; //2,1
 6:      cout<<"a  "<<a<<endl;              //3
 7:      a = 1;
 8:      printf("a  %d  %d\n",a++,a++);     //2,1
 9:      printf("a  %d\n",a);               //3
 10:   
 11:      //------------------------------------------------------------------------------------
 12:      // 以下部分, 含有前綴操作符,計算a的最終數值為3 首先是++a入棧為3,之後是++a入棧為3
 13:      a = 1;
 14:      cout<<"a  "<<++a<<"  "<<++a<<endl; //3,3
 15:      cout<<"b  "<<a<<endl;              //3
 16:      a = 1;
 17:      printf("a  %d  %d\n",++a,++a);     //3,3
 18:      printf("a  %d\n",a);               //3
 19:   
 20:      //------------------------------------------------------------------------------------
 21:      // 以下部分, 含有前綴操作符, 計算a的最終數值為3,首先是++a入棧為3,a=2之後是a++入棧為2
 22:      a = 1;
 23:      cout<<"a  "<<a++<<"  "<<++a<<endl; //2,3
 24:      cout<<"a  "<<a<<endl;              //3
 25:      a = 1;
 26:      printf("a  %d  %d\n",a++,++a);     //2,3
 27:      printf("a  %d\n",a);               //3
 28:   
 29:      //------------------------------------------------------------------------------------
 30:      // 以下部分, 含有前綴操作符, 計算a的最終數值為3,首先是a++入棧為1,a=2之後是++a入棧為3
 31:      a = 1;
 32:      cout<<"a  "<<++a<<"  "<<a++<<endl; //3,1
 33:      cout<<"a  "<<a<<endl;              //3
 34:      a = 1;
 35:      printf("a  %d  %d\n",++a,a++);     //3,1
 36:      printf("a  %d\n",a);               //3
 37:   
 38:      int b;
 39:      a = 1;
 40:      b = 1;
 41:      // 左右操作符號都是b++,不含有前綴操作符,則左右操作數都替換為1,a=1+1=2
 42:      a = (b++)+(b++);
 43:      printf("a = (b++)+(b++)  %d %d\n",a,b);//2,3
 44:      a = 1;
 45:      b = 1;
 46:      // 含有前綴操作符,前綴操作符替換為3,a=3+3=6
 47:      a = (++b)+(++b);
 48:      printf("a = (++b)+(++b)  %d %d\n",a,b);//6,3
 49:      a = 1;
 50:      b = 1;
 51:      // 由於含有前綴操作符,則含前綴操作符的部分替換為3,含後綴操作符的還是原數值,a=3+1=4
 52:      a = (++b)+(b++);
 53:      printf("a = (++b)+(b++)  %d %d\n",a,b);//4,3
 54:   
 55:      a = 1;
 56:      b = 1;
 57:      // 由於含有前綴操作符,則含前綴操作符的部分替換為6,含後綴操作符的還是原數值1,a=6+6+6+1+1=20
 58:      a = (++b)+(++b)+(++b)+(b++)+(b++);
 59:      printf(" a = (++b)+(++b)+(++b)+(b--)  %d %d\n",a,b); //20,6
  而對於重載的++、--操作符,情況類似,如下例子,注意第22行代碼:
 
 1:  class Example{
 2:  public:
 3:  Example(int i,int j) { _x = i; _y = j;}
 4:  // 前綴形式(++i)重載的時候沒有虛參,通過引用返回*this,也就是返回變化之後的數值
 5:  const Example& Example::operator++ () {
 6:            ++_x;
 7:            ++_y;
 8:            return *this;
 9:  }
 10:  // 後綴形式(i++)重載的時候有一個int類型的虛參, 返回原狀態的拷貝
 11:  const Example Example::operator++ (int) {
 12:              Example tmp(*this);
 13:              ++_x;
 14:              ++_y;
 15:              return tmp;    
 16:  }
 17:  int _x, _y;        
 18:  };
 19:  Example ei(1,2);
 20:  cout<<"ei "<<(ei++)._x<<"  "<<ei._y<<endl;  // 1,2  ei++的時候,返回的是ei原狀態的拷貝,此時原ei的狀態已經更新
 21:  cout<<"ei "<<(ei)._x<<"  "<<ei._y<<endl;    // 2,3  ei的狀態已經更新,_x = 2, _y = 3
 22:  cout<<"ei "<<(++ei)._x<<"  "<<ei._y<<endl;  // 3,3  首先是ei._y入棧,此時ei尚未更新,入棧為3,之後入棧(++ei)._x,ei已經更新,入棧為3
 23:  cout<<"ei "<<(ei)._x<<"  "<<ei._y<<endl;    // 3,4  ++ei的時候,ei已經更新,_x = 3, _y = 4;
 
作者“成長之路”

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved