自增自减问题,结果是跟编译器相关的。
VS08下测试结果是:9896,其他平台可能不同。我就这一结果给你提供一个分析,其他结果参照具体编译器结合性才好推断。
背景:
后自增、后自减操作符:
先返回i的值,即表达式的结果是i,然后执行 i = i+1,这种方法会产生副本拷贝;
前自增、前自减操作符:
是先加(或先减),表达式的值是+1(或-1)后的结果,这种方法不会产生副本拷贝;
分析:
不妨标记四个输出为y1 y2 y3 y4。此处输出缓冲区保留y的副本,cout在在endl结束输出缓冲区后一并输出,此时y4 = y = ++x = 6;y4++后y值为7,++y3后y值为8;y2即赋为y值8,y2++后y值9。
计算完毕之后输出,y1,y3无副本所以输出y的最终计算值9;y2,y4分别输出运行时副本值8,6,最终结果即为9896
其他值得注意的问题:
1#. 一般的,表达式的计算顺序默认是由左到右(此处由于缓冲队列在同一个y副本上操作,不是一般状态),而关于此类自增减的问题,有一种解释是cout的结合性是由右向左的,但从官方代码来看这一说法没有根据。
2#.后自增、后自减操作符的优先级大于前自增、前自减操作符,这在自增自减问题结合时会常考察到。
P.S.
这种自增自减型的问题比较古老了,结果是跟编译器相关的,取决于编译器的逗号表达式及自增减运算结合性,纠结这些完全没什么价值。以后正常的考试面试神马的如果还出现这类题型,那出题人绝对是脑子被驴踢了...当然如果是应聘编译器开发先关的职位就另说了...
P.P.S.
LZ头文件貌似失手打错了吧...另外没有using namespace std的话,使用cout需要加std::名字空间前缀的呦~
温馨提示:答案为网友推荐,仅供参考