规规矩矩写代码,神鬼不欺

1511阅读 0评论2012-11-26 bruceteen
分类:C/C++

原代码来源于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++ 中的 = 操作。


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

上一篇:VC9的Bug
下一篇:"123456" 的MD5值