cout输出之疑问

hhy123 2009-05-26 05:10:09
int a[] = {1,2,3,4,5};
int *p = a;
(1)cout<<(*(++p)++)<<*p++<<endl;
(2)cout<<(*(++p))<<*p++<<endl;
(3)cout<<(*(p++)++)<<*p++<<endl;

vc6运行结果如下:
(1)3 2
(2)3 1
(3)编译有错

请大侠解释一下原因。谢谢
...全文
364 58 打赏 收藏 转发到动态 举报
写回复
用AI写文章
58 条回复
切换为时间正序
请发表友善的回复…
发表回复
fairchild811 2009-05-28
  • 打赏
  • 举报
回复
拿codeblocks搞了一下,发现结果不一样吗
fairchild811 2009-05-28
  • 打赏
  • 举报
回复
楼主的意思是每个测试一次,不是所有代码在一起
++这个太烦人了.
fairchild811 2009-05-28
  • 打赏
  • 举报
回复
4楼的比较详细了,主要就是运算符优先级,括号,前++,后++,前++后是左值
amossavez 2009-05-28
  • 打赏
  • 举报
回复
靠,别再讨论这样的东西了,烦!!
cxf7394373 2009-05-28
  • 打赏
  • 举报
回复
优先级的问题,前置与后置,*,
还有就是编译器的问题
MichaelBomb 2009-05-28
  • 打赏
  • 举报
回复
顶起,学习
Jalien 2009-05-28
  • 打赏
  • 举报
回复
前面遇到这样类似的贴,是编译器相关的,lz多个编译器就知道了[Quote=引用 51 楼 hhy123 的回复:]
感谢大家的积极参与,通过大家的启发,继续研究后得出结论,盼大家指正:

int a[50]={1,2,3,4,5, 6, 7, 8,9 ,10, 11, 12, 13, 14};
int *p = a;

(1) cout < <(*p++) < <'\t' < <(*p++) < <endl; //2 1
(2) cout < <(*++p) < <'\t' < <(*p++) < <endl; //3 1
(3) cout < <(*++p) < <'\t' < <(*++p) < <endl; //3 2
(4) cout < <(*p++) < <'\t' < <(*++p) < <endl; //2 2

分析1(很多人认可):cout是从右向左…
[/Quote]
hhy123 2009-05-27
  • 打赏
  • 举报
回复
感谢大家的积极参与,通过大家的启发,继续研究后得出结论,盼大家指正:

int a[50]={1,2,3,4,5, 6, 7, 8,9 ,10, 11, 12, 13, 14};
int *p = a;

(1) cout<<(*p++)<<'\t'<<(*p++)<<endl; //2 1
(2) cout<<(*++p)<<'\t'<<(*p++)<<endl; //3 1
(3) cout<<(*++p)<<'\t'<<(*++p)<<endl; //3 2
(4) cout<<(*p++)<<'\t'<<(*++p)<<endl; //2 2

分析1(很多人认可):cout是从右向左处理,从左向右输出

(5)cout<<*(++p)++<<'\t'<<(*p)<<endl; //2 2
cout<<*p<<endl; //3

分析2(猜想):cout中运算步骤多的先运算,然后再按分析1处理

解释:*(++p)++比*p多一步运算,先算++p,再按分析1处理

验证:下面举例验证

(6)cout<<*(++p)++<<'\t'<<(*p++)<<endl;//3 2
cout<<*p<<endl;//4
解释:先算++p

(7)cout<<*(++p)++<<'\t'<<(*(++p))<<endl; //3 3
解释:先算左边++p,再算右边++p,因此右边输出3

(8)cout<<*(++p)++<<'\t'<<(*(++p)++)<<endl; //4 3
解释:先算右边和左边的++p,再从右到左运算,因此右边输出3,右边运算完后要移动指针
因此左边输出4

(9)cout<<*(++p)++<<'\t'<<(*++(++p))<<endl; //4 4
解释:原因同(8)

(10)cout<<*++(++p)<<'\t'<<(*++(++p))<<endl; //5 4
解释:原因同上

(11)cout<<*(++(++p))++<<'\t'<<(*++(++p))<<endl; //5 5
解释:先算左边++p,再右边++p,再左边++(++p),再右边++(++p),因此右边输出5

(12)cout<<*(++(++p))++<<'\t'<<*(++(++p))++<<endl; //6 5
解释:原因同(11)

(13)cout<<*(++(++p))<<'\t'<<(*++(++p))<<"\t"<<*p<<endl; //5 4 3
解释:先中间++p,再左边++p,再右边,因此右边输出3,中间再++,输出4,左边再++,输出5

(14)cout<<*(++(++p))<<'\t'<<(*++(++p))<<"\t"<<*p++<<endl; //6 5 3
解释:原因同(13),不同之处右边计算后要移动指针

(15)cout<<*(++(++p))++<<'\t'<<(*++(++p))<<"\t"<<*p++<<endl;//6 6 4
解释:先左边++p,再中间++p,再左边++,再右边运算,因此右边输出4,移动指针后中间++,输出6,
再左边输出6

(16)cout<<(*(++p)++)<<"\t"<<(*p++)<<"\t"<<*p<<"\t"<<endl;
解释:这是研究该问题的起源,目前再分析就比较容易理解
先算左边++p,再右边运算,输出2,再中运算,输出2,移动指针后再左边运算,输出3

总结:(1)我没有搞过编译,分析(2)是猜想,并通过实验验证,结论似乎正确,望高手指正。
(2)很多人谈到,这个问题没有太大实际意义,我想也是。但这是别人问我的一个问题,总得给别人一个解释,
把它当作娱乐吧。
nwao7890 2009-05-27
  • 打赏
  • 举报
回复
mark
蜥蜴枪王 2009-05-27
  • 打赏
  • 举报
回复
我是来学习的
ljl2200062 2009-05-27
  • 打赏
  • 举报
回复
*和++是同级运算,其结合规则是从右到左
*p++等同于*(P++)
hhy123 2009-05-27
  • 打赏
  • 举报
回复
能否把你的想法说说?
[Quote=引用 42 楼 zb_0527 的回复:]
虽然有些晕,但细想想还是能得出结果的..嗯..
[/Quote]
T技术沙龙 2009-05-26
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 mengde007 的回复:]
加了那么多次;貌似已经出界了;
[/Quote]
#include"iostream"
using namespace std;

int main()
{
int a[]={1,2,3,4,5};
int *p=a;//这里p指向a[0]
cout<<(*(++p)++)<<*p++<<endl;//结束时p指向a[2]
cout<<(*(++p))<<*p++<<endl;//结束时p指向a[4]
cout<<(*(p++)++)<<*p++<<endl;//此时已经越界了
return 0;
}
wsmyaoquhuawei 2009-05-26
  • 打赏
  • 举报
回复
UP!
xobrandy 2009-05-26
  • 打赏
  • 举报
回复
一看就是分开弄的嘛!
gomas 2009-05-26
  • 打赏
  • 举报
回复
mark
zb_0527 2009-05-26
  • 打赏
  • 举报
回复
虽然有些晕,但细想想还是能得出结果的..嗯..
colystudio 2009-05-26
  • 打赏
  • 举报
回复
39、40是我的答案,并且做过广告:
招募QQ群86992833招募,有一定基础,并且真心喜欢C++的人员。作为技术交流。
colystudio 2009-05-26
  • 打赏
  • 举报
回复
(3)cout <<(*(p++)++) << *p++ <<endl;
p++ 使p等于p+1但返回的是p以前的值,一个数值不是变量,不能在++了
colystudio 2009-05-26
  • 打赏
  • 举报
回复
以前帮人解的一个例子:
int a[5] = {1, 2, 3, 4, 5};
int *p;
p = a;
cout<< *(p++) << *p ++ << (*p)++ <<endl;
解:
operator<<(operator<<(operator<<(cout, *(p++)), *p++), (*p)++)
2,2,1
函数从右开始启动,但cout输出却是从左开始输出
加载更多回复(38)

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧