弱智问题,弱智问题,弱智问题

najiushifeng9 2007-08-04 08:52:30
#include <iostream>
using namespace std;
class A
{
public:
A(int x){rx=x;}
int operator++(){rx++;return rx;}
int operator++(int){int i=rx;rx++;return i;}
friend ostream& operator<<(ostream &s,const A c)
{
s<<c.rx;
return s;
}

private:
int rx;
};

int main()
{
A a(4),b(5);
cout<<a<<b<<endl;
cout<<++a<<a++<<endl;
system("pause");
return 0;
}
输出:
4 5
6 4
为什么会这样,第一次重载是从左到右,第二次好象是从右往左啊。
...全文
394 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
WarriorKing 2011-08-10
  • 打赏
  • 举报
回复
我个人觉得这个问题很有趣,不过这跟编译器有关

我以前做了个实验

cout <<++a <<a++ << ++a << ++a << endl;

cout <<a++ <<++a << ++a << a++ << endl;

cout <<a++ << a++ << a++ << ++a << endl;

结果完全不一样,这个我也回答不出来是怎么回事,反正麻烦,这个就得去找编译器设计师去解答了
gaomingok 2011-08-08
  • 打赏
  • 举报
回复
楼主把输出格式和入栈顺序弄混了
sdudubing 2011-08-08
  • 打赏
  • 举报
回复
学习了
jingavin0 2011-08-08
  • 打赏
  • 举报
回复
这是打印规则啊,如果在打印的时候有计算的话都是从右往左的,你可以参考printf的打印规则,和cout是一样的
liutengfeigo 2011-08-07
  • 打赏
  • 举报
回复
考古队的路过.
taodm 2011-08-07
  • 打赏
  • 举报
回复
楼上这位是考古队来的?4整年前的帖子啦。
ychtx 2011-08-07
  • 打赏
  • 举报
回复
编译器在编译时是先从右到左把所有的表达式的值计算出来,然后再从左到右输出的。
taodm 2007-08-06
  • 打赏
  • 举报
回复
楼主,你测5万个编译器得到相同结果也没用,因为C++标准说了这是未定义行为。
晨星 2007-08-06
  • 打赏
  • 举报
回复
另外即使你说的一边求值一边压栈,那么也不能从右边先开始计算结果吧。
——为什么不能呢?你能从C++标准中找出不能的依据么?我是找不到。
najiushifeng9 2007-08-05
  • 打赏
  • 举报
回复
要没人懂,我就删除了
hyq248021399 2007-08-05
  • 打赏
  • 举报
回复
1.谁敢说<<就是从右到左求,看看cout<<a<<b<<endl;的输出

2.问题只要存在就有意义,另外该问题跟编译器无关,我先后在5个编译器上测试过了,输出都是一个结果。
------------------------------------------------------------------------------------
1.这里指的是处理顺序,不是显示顺序
2.大部分编译器的确是从右至左处理输出流,但不是所有的,没有一个标准
所以lz不要研究这种问题了
najiushifeng9 2007-08-05
  • 打赏
  • 举报
回复
问题只要存在就有意义,另外该问题跟编译器无关,我先后在5个编译器上测试过了,输出都是一个结果。
dabang_007 2007-08-05
  • 打赏
  • 举报
回复
应该又是和编译器相关的问题,相当于int i=10;cout<<++i<<i++那样的问题。这种问题没有意义
najiushifeng9 2007-08-04
  • 打赏
  • 举报
回复
不用的编译器结果都一样,另外即使你说的一边求值一边压栈,那么也不能从右边先开始计算结果吧。
晨星 2007-08-04
  • 打赏
  • 举报
回复
在C/C++语言中,大多数表达式中各子表达式的求值顺序,以及函数参数的压栈顺序都是未定义的。
而且它们俩还不是一回事。楼主仿佛只知道有个参数压栈顺序的问题,却不知道还有个表达式求值的问题。
当给一个函数传进来的参数不是一个简单的变量,而是一个有运算的表达式时,可能发生先把所有的表达式求值,再进行参数压栈的情况;也有可能是一边求值一边压栈,求出一个压一个,不同的编译器做法不尽相同,所以出现不同的结果就更不奇怪了。

这也是为什么实际中不要写这种代码。
najiushifeng9 2007-08-04
  • 打赏
  • 举报
回复
谁敢说<<就是从右到左求,看看cout<<a<<b<<endl;的输出
tiantang3gm 2007-08-04
  • 打赏
  • 举报
回复
<<就是从右到左求的!
你可以试一下
int i=0;
cout<<i+3<<i++<<endl;
输出的就是
40

貌似标准上除了逗号运算符,别的地方没有给出过计算顺序要求。。
还有哪个地方?我没有看到。
tiantang3gm 2007-08-04
  • 打赏
  • 举报
回复
重载没有问题。
遇上这种问题还真是不幸,看汇编吧。
牵扯到栈问题的,谁对谁错呢?
很多种方法可以实现自己的逻辑,选择一个算了吧,别跟编译器过不去。

编译器能够忍受了我们那么多的蹂躏,好好爱惜吧。
shenmiaoqi 2007-08-04
  • 打赏
  • 举报
回复
<<就是从右到左求的!
你可以试一下
int i=0;
cout<<i+3<<i++<<endl;
输出的就是
40
uzone 2007-08-04
  • 打赏
  • 举报
回复
我觉得应该是4.6

64,652

社区成员

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

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