当前位置:编程学习 > 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
补充:软件开发 , C++ ,

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,