x先自加值是7
x在相加三次值是21
6楼和16楼说的不错,但这实际上是编译器对系统默认参数类型的快速处理导致的问题。
数学上正确的顺序是先算所有的括号,然后在按运算符优先级逐个计算,而这里的运算变成了从左起什么能算的先算,直到遇到优先级比自己高的才停止,算出优先级高的之后接着算。
这个规律不是普遍的,同样的编译器对系统自在类型是这么算,对用户定义的类型就变成了先算所有括号的方法。
楼主贴的帖子用int算得19。如果用户自己写成一个类来算结果就是18。
#include <iostream>
using namespace std;class CTest
{
public:
CTest(int v=0) : val(v) {};
CTest operator + (CTest b){cout << \"plus \"<< endl; return CTest(val+b.val);}
CTest operator ++ (){cout << \"++\" << endl; return CTest(++val);}
int val;
};void main()
{
CTest x(4),y(0);
y=(++x)+(++x)+(++x);
cout << \"y=\" << y.val << endl;
}
#include <iostream>
using namespace std;
class CTest
{
public:
CTest(int v=0) : val(v) {};
CTest operator + (CTest b){cout << "plus "<< endl; return CTest(val+b.val);}
CTest operator ++ (int){cout << "++" << endl; return CTest(val++);}
int val;
};
void main()
{
CTest x(4),y(0);
y=(x++)+(x++)+(x++);
cout << "y=" << y.val << endl;
}
//那为什么这个不是12?