回复 9楼 a99875984
你的代码行为,有好几处是“实现定义的”,也就是说C++标准没有规定其行为必须如何如何
也就是对于你这段代码,不同的编译器可能输出不同的结果。这样的陷阱式代码是最不能为人所容忍的,所以你不该写出这样的代码;也不用浪费时间去研究它,因为标准对其无定义,顶多你只能搞明白某个编译器为什么这么输出,但这和C++无关。
对于你给的代码,我先吐槽两个不相干的问题
a. C++中没有 iostream.h 这个头文件(历史上是有的,但早就被废弃了)
b. C++中不允许函数省略返回类型(历史上是可以的,但早就被禁止了)
言归正传
1。cout<<x++<<endl<<x++<<endl<<x++<<endl; 等同于 cout.operator<<(x++).operator<<(endl).operator<<(x++).operator<<(endl).operator<<(x++).operator<<(endl)
operator<< 可以看成一个成员函数名,去掉不相干的东西,可以看作
obj.menfun(x++).menfun(x++).menfun(x++)
注: 是否是“等同于”要看库的实现,但这不是重点。你可以参考一下这篇文章 http://blog.
2。对于 obj.menfun(x++).menfun(x++).menfun(x++)
是哪个x++先入栈?这是标准未规定的,如果是从右往左入栈的话,那就可能输出 3 2 1
注:只是“可能”,因为这还涉及的“顺序点”的问题
3。顺序点
我随便Google到一个“顺序点”的文章,你先看懂 http://developer.
注意其中第六条“6)在函数所有参数赋值之后但在函数第一条语句执行之前;”
对于 obj.menfun(x++).menfun(x++).menfun(x++)
是第一个menfun是执行,也就是说三个 x++ 在同一个顺序点之间,那么其行为又是“实现定义的”