原文 http://www.cnblogs.com/alex-tech/archive/2011/03/27/1997075.html
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;