Chinaunix首页 | 论坛 | 博客
  • 博客访问: 987921
  • 博文数量: 158
  • 博客积分: 4380
  • 博客等级: 上校
  • 技术积分: 2367
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-21 10:45
文章分类

全部博文(158)

文章存档

2012年(158)

我的朋友

分类: C/C++

2012-11-26 16:03:39

原代码来源于csdn
istream_iterator in_iter(cin);
istream_iterator eof;
ostream_iterator out_iter(cout, "\n");


while( in_iter!=eof )
{
    *out_iter++ = *in_iter++;
}
输入 1 2 3 4,这段代码输出 1 2 3,再输入 5 6 7 8,输出 4 5 6 7,即最后一个总是迟迟不肯输出


不喜欢变态代码,因此改为
for( ; in_iter!=eof; ++in_iter, ++out_iter )
{
    *out_iter = *in_iter;
}
看不出任何问题,运行测试一下,也没有任何问题。


看来问题出在 *in_iter++ 处,后++的伪代码大体如下:
type operator++(int) // postincrement
{
    type _tmp = *this; // 备份
    ++*this; // 自增
    return _tmp; // 返回原先值
}
因此 in_iter++ 的本质其实是:in_iter自增,而后返回自增前的值
而非想当然的:返回in_iter的值,而后in_iter自增


对于本段代码而言,假如没有下一个输入的int值,则运行时将一直停留在in_iter自增处,没法执行 *out_iter++ = *in_iter++ 中的 = 操作。


因为制定语法的人,编写编译器的人,测试的人一般而言是正常的,所以写正常的代码将少出错误。

阅读(1452) | 评论(0) | 转发(0) |
0

上一篇:VC9的Bug

下一篇:"123456" 的MD5值

给主人留下些什么吧!~~