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;
作者“成長之路”