【求助】cout输出顺序

xiabing123sd 2008-11-20 08:37:13
#include<iostream>
using namespace std;
int f(int a)
{
auto int b=0; //auto可以省略
static int c=3;
b+=1;
c+=1;
return a+b+c;
}

int main()
{
int a=2,i;
/*for(i=0;i<3;i++)
cout<<f(a)<<" ";
cout<<endl;*/
cout<<f(a)<<" "<<f(a)<<" "<<f(a)<<endl;
return 0;
}

此时输出是9 8 7
而把注释的内容替换它下面的输入语句,输出是7 8 9
请问高手,为什么同样调用3次f(a),输出顺序相反呢?
我用的是VC6.0
不胜感激
...全文
335 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiabing123sd 2008-11-21
  • 打赏
  • 举报
回复
谢谢,知道了,初学C++,好多东西还不懂
lann64 2008-11-21
  • 打赏
  • 举报
回复
c++标准说,这是未定义行为。所以编译器怎么实现都可以。
xiabing123sd 2008-11-21
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 lann64 的回复:]
引用 13 楼 xiabing123sd 的回复:
cout的确是自右向左的
int a(1),b(2),c(3);
cout < <a < <b < <c;
先把c,b,a放入缓冲区,输出就是a,b,c
因为函数返回存在缓冲区,所以f(a)的值直接输出,因为cout顺序自右向左,所以输出9 8 7

这样理解貌似可以,谢谢诸位的解答

你愿意这样理解就这样理解好了,但显然这个是错误的。
cout < <a < <b < <的等价表示是((cout < <a) < <b) < <c,看了这个,还认为是自右向左吗?
[/Quote]
cout顺序的确有问题,如你讲,同一条语句中多次使用变量自增自减,我试了下,果然输出顺序不能确定
不知道用其他编译器是否有这种问题
lann64 2008-11-20
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 xiabing123sd 的回复:]
cout的确是自右向左的
int a(1),b(2),c(3);
cout < <a < <b < <c;
先把c,b,a放入缓冲区,输出就是a,b,c
因为函数返回存在缓冲区,所以f(a)的值直接输出,因为cout顺序自右向左,所以输出9 8 7

这样理解貌似可以,谢谢诸位的解答
[/Quote]
你愿意这样理解就这样理解好了,但显然这个是错误的。
cout<<a<<b<<的等价表示是((cout<<a)<<b)<<c,看了这个,还认为是自右向左吗?
xiabing123sd 2008-11-20
  • 打赏
  • 举报
回复
cout的确是自右向左的
int a(1),b(2),c(3);
cout < <a < <b < <c;
先把c,b,a放入缓冲区,输出就是a,b,c
因为函数返回存在缓冲区,所以f(a)的值直接输出,因为cout顺序自右向左,所以输出9 8 7

这样理解貌似可以,谢谢诸位的解答
qqwx_1986 2008-11-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lann64 的回复:]
没有右边优先这种说法。
恰恰相反,cout是左结合的。

而且楼主的例子非常怀疑是vc6的bug。
两种方式似乎都应该是输出7 8 9
[/Quote]
dev和vc6输出的顺序是一样的?

[Quote=引用 6 楼 nklvdi 的回复:]
C/C++ code
cout的输出是先从右往左读入缓冲区,再从左往右输出;
假设a = 1; b = 2; c = 3;
cout<<a<<b<<c<<endl;
缓冲区:|3|2|1|<- (把“<-”看作是指针)

输出:|3|2|<- (输出 1)
|3|<- (输出 2)
|<- (输出 3)

你的f(a)是直接进入缓冲区的:|7|8|9|
输出<-
缓冲区相当于堆栈的效果。。。
[/Quote]
这种解释得当....
setoption9 2008-11-20
  • 打赏
  • 举报
回复
mark
qap22 2008-11-20
  • 打赏
  • 举报
回复
mark
lann64 2008-11-20
  • 打赏
  • 举报
回复
嗯,或许我前面说是bug的说法也错了。缓冲区?也有存疑。
我的理解,这个是未定义行为。
这个应该是类似于同一条语句中多次使用变量自增自减一样,只不过这里用了个函数来伪装。
对于<<这样的操作符,应该是没定义操作数运算次序的,那么编译器先算哪个都可以。应该编程者自己防止写出这样的语句。
霍大脚 2008-11-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wuyu637 的回复:]
cout是一个右边优先的运算符,就是说他是先算右边的表达式的。
[/Quote]
哪有这种说法
int a(1),b(2),c(3);
那cout<<a<<b<<c;呢
怎么是1 2 3呢
因为函数返回存在缓冲区的,所以fun()不用存入缓冲区,直接读出,而进入缓冲区是7 8 9的
霍大脚 2008-11-20
  • 打赏
  • 举报
回复
MRAK啊
霍大脚 2008-11-20
  • 打赏
  • 举报
回复

cout的输出是先从右往左读入缓冲区,再从左往右输出;
假设a = 1; b = 2; c = 3;
cout<<a<<b<<c<<endl;
缓冲区:|3|2|1|<- (把“<-”看作是指针)

输出:|3|2|<- (输出 1)
|3|<- (输出 2)
|<- (输出 3)

你的f(a)是直接进入缓冲区的:|7|8|9|
输出<-
缓冲区相当于堆栈的效果。。。

lann64 2008-11-20
  • 打赏
  • 举报
回复
没有右边优先这种说法。
恰恰相反,cout是左结合的。

而且楼主的例子非常怀疑是vc6的bug。
两种方式似乎都应该是输出7 8 9
xiabing123sd 2008-11-20
  • 打赏
  • 举报
回复
谢谢,总算知道了,基础很重要
lann64 2008-11-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wuyu637 的回复:]
cout是一个右边优先的运算符,就是说他是先算右边的表达式的。
[/Quote]

嗯?
wuyu637 2008-11-20
  • 打赏
  • 举报
回复
cout是一个右边优先的运算符,就是说他是先算右边的表达式的。
wuyu637 2008-11-20
  • 打赏
  • 举报
回复
int test1()
{
cout << "NO 1;" <<endl;
return 1;
};
int test2()
{
cout << "NO 2;" <<endl;
return 2;
}
int test3()
{
cout << "NO 3;" <<endl;
return 3;
}
int main()
{
int a=2,i;
/*for(i=0;i <3;i++)
cout <<f(a) <<" ";
cout <<endl; */
//cout <<f(a) << endl <<f(a) <<" " <<f(a) <<endl;
cout << test1()<< test2() << test3()<< endl;
return 0;
}

64,660

社区成员

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

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