初学者提问,请帮看下两段代码的执行的时候有什么不同

菜鸟提问,请帮看下两段代码的执行的时候有什么不同?
1.第一段代码

#include <iostream>
#include <string>
#include <iterator>
using namespace std;

int main()
{
ostream_iterator<string> out_iter(cout,"\n");
istream_iterator<string> in_iter(cin), eof;

while(in_iter != eof)
{
*out_iter = *in_iter;
++in_iter;
++out_iter;
}
return 0;
}

2.第二段代码

#include <iostream>
#include <string>
#include <iterator>
using namespace std;

int main()
{
ostream_iterator<string> out_iter(cout,"\n");
istream_iterator<string> in_iter(cin), eof;
        //只是这个循环体不同
while(in_iter != eof)
{
*out_iter++ = *in_iter++;
}
return 0;
}


【输入】hello world 回车
【输出】
第一段代码输出:
hello
第二段代码输出:
hello
world
【问题】
*out_iter++ = *in_iter++;

*out_iter = *in_iter;
++in_iter;
++out_iter;

到底区别在哪?请详细解释下,谢谢!

------解决方案--------------------
第一个, 先输出, 再移动.
第二个, 先移动, 再输出.

第二个等价于:
  out_temp = out_iter;
  in_temp = in_iter;
  ++out_iter;
  ++in_iter;
  *out_temp = *in_temp; // 注意 ++ 在 = 之前. 第一个是 ++ 在 = 之后.

------解决方案--------------------
楼上正解。

*out_iter++ = *in_iter++;的步骤是先移动,再输出,于是在in_iter向后移动时,发现后面输入缓冲区空,又没有到文件尾,于是开始等待用户输入,而这时最后一个单词还没有输出。

一般输入输出流迭代器更适合用于处理文本文件而不是控制台IO,上面两段代码在处理文件时会产生相同的效果。