今天遇到一个奇怪的问题:
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的类型必须相同,且只能在一条语句中