cout输出流执行顺序问题

今天遇到一个奇怪的问题:

cout << it->second[i] << "mark";
cout << it->second[i] << ' ' << (--it)->second[i] << ' ' << (++(++it))->second[i] << endl;

其中it是一个map迭代器指针,map的value部分是一个数组,mark单词两边打印出来的值竟然不同!


研究了半天,也不知道是什么原因,喊过来实验室的同学一起看了下,有看了看it->second这个值两边的数据,发现第二次打印的it->second是第一次打印的it->second的下一个值,同学说是map的迭代器自动后移了,但是我之前都是这么用的啊,没见map的迭代器自动后移的啊!


突然我想到了可能是cout输出顺序的问题,上网一查!果不其然!在此记录一下:

首先看一个例子:

#include <iostream> 
using namespace std;

int fun1(){
	cout<<"num1"<<endl;
	return 1;
}

int fun2(){
	cout<<"num2"<<endl;
	return 2;
}

int main(){
	cout<<fun1()<<"  "<<fun2()<<endl;
	return 0;
}

输出为:


这是为什么呢?

因为:

cout的计算顺序是:自右向左;输出顺序为:自左向右!

cout 作为输出流,有一个缓冲区,先从右往左将输出读入缓冲区,然后以类似堆栈的方式将缓冲区的数据读出来

假设a = 1; b = 2; c = 3;
cout<<a<<b<<c<<endl;
缓冲区: |3|2|1|<-   (把“<-”看作是指针,类似于压栈push的操作)
输出:  |3|2|<-     (输出 1,类似于出栈pop操作)
        |3|<-       (输出 2)
        |<-         (输出 3)
结果就是123.

那么上面的例子那么输出的原因就是:

首先从右往左读入,先执行fun2(),输出num2,并将返回值2保存进缓冲区,再执行fun1(),输出num1,并将返回值1保存进缓冲区。最后开始读取缓冲区中的内容,输出1 2。



题外话:

今天在C++的工程中写for循环,在循环语句:

for ( init-statement; condition; expression )
     statement;

init-statement 可以定义多个对象,但只能有一条声明语句,因此,所有变量的基础类型必须相同。

例如:
for ( int i = 0,  j = 9; i != j; ++i )
        ...
i和j的类型必须相同,且只能在一条语句中





  • 10
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值