cout<<y<<y++<<++y<<y++<<endl怎么算

c程序算法
#include "iostream.h"
void main()
{int x=5,y;
y=++x;
cout<<y<<y++<<++y<<y++<<endl;
}
答案是:9886 怎么算的?

自增自减问题,结果是跟编译器相关的。
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::名字空间前缀的呦~
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-01-04
首先x是5
y=++x,因为++运算符在x前面,所以先执行自增再赋值,因此x变为6再赋值给y,此时y就是6
现在x因为自增了一次变为6了,y也因为x的赋值而变为6了,那么算算下面的cout吧
cout<<y<<y++<<++y<<y++<<endl;
因为输出的是4段:1、y 2、y++ 3、++y 4、y++ 。下面逐个分析这4个。
1、因为y这时候就是6,所以这第一段就是6
2、y++,因为自增运算符在y后面,就是先赋值再自增,那么这段也是6,只是在这段完成以后,y会自动变为7
3、++y,这又是自增运算符在y前面,先自增再赋值,那么就是y先变为8,再显示这段的结果,因此这段就是8
4、y++,与第2段相同,先赋值,再自增,就是说这段还为8,然后再自增,但是没有第5段了,自增了也看不出了,也就是说,程序执行endl要结束的时候,y的值会变为9
所以,最终的结果是 6 6 8 8
呵呵,这么细致的分析,你应该能看懂吧,否则只能怪我的文字表达能力了,让我用嘴说的话,肯定比这个说的明白多了。
第2个回答  2011-01-04
第1行头文件是iostream
至于这个结果,不同编译程序结果不一,TC 一般从左向右,VC一般从右向左,C++ 标准并没有规定函数调用时各个参数的计算次序
第3个回答  2011-01-04
假设y=2;
那么输出为:2 2 4 4
y++的话是先执行相关操作,然后自己++,++y的话是先自己++,然后再执行其他操作。
所以在第二个输出的时候,先输入2,然后自己++变成3,第三个输出的时候先++后就变成了4。
第4个回答  2011-01-04
cout执行时候是从右往左,也就是先执行y++ ------>++y-------->y++----------------->y 结果就是6------>8--------->8---------->9
相似回答