第十八章 25重载自加运算符的执行次序
// 25重载自加运算符的执行次序 /* #include <iostream> using namespace std; class A { public: A(int n){ rx=n;} friend ostream&operator<<(ostream&s, const A&c){ s<<c.rx<<endl; return s; } //前置运算符 int operator++(){ cout<<"++i"<<endl; rx++; return rx; } //后置自加 int operator++(int){ cout<<"++i"<<endl; int i= rx; rx++; return i; } private: int rx; }; int main() { A a(3); //cout<<a++<<++a<<endl; //这样输出55是正常的 cout<<++a<<a++<<endl; //这样输出的是5 3 //给两个函数增加功能,前置自加就是先自加,然后返回自加后的值 //后置自加与其相反,需要先将rx的值返回,然后再自加 //后置自加运算符函数operator++(int)调用在先, //前置自加运算符函数operator++()调用在后,输出的数值更中令人迷糊了,先车出5.然后输出3这是为什么 //这是因为当给一个函数传进来的参数不是一个简单的变量,而是一个有运算的表达式时,可能发生先把所有的表达式求值,再进行参数压栈的情况,也有可能是一边求值一边压栈,求出一个压一个,不同的编译器做法不尽相同 //首先将参数的值求出,然后再压栈,由于在无括号的情况下,求参数的值的顺序是从右到左的,因此首先求最右侧的参数a++; return 0; }*/