首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这是C++中的一个bug吗?(“<<C++ primer>>”一书可能错了?)

这是C++中的一个bug吗?(“<<C++ primer>>”一书可能错了?)
EN

Stack Overflow用户
提问于 2020-06-16 08:24:08
回答 1查看 106关注 0票数 2
代码语言:javascript
复制
//Wrong Code
#include<iostream>
#include<iterator>
using namespace std;
int main(){
    istream_iterator<string> in_iter(cin),eof;
    ostream_iterator<string> out_iter(cout," ");
    while(in_iter!=eof)
        *out_iter++ = *in_iter++;
}

输入:(在交互模式中通过"visual c++"、"cpp.sh"、"onlinegdb“和任何您喜欢的工具运行上面的代码.)

代码语言:javascript
复制
aa bb cc 6 dd ee

输出:

代码语言:javascript
复制
aa bb cc 6 dd

实际上正确的代码应该是:

代码语言:javascript
复制
#include<iostream>
#include<iterator>
using namespace std;
int main(){
    istream_iterator<string> in_iter(cin),eof;
    ostream_iterator<string> out_iter(cout," ");
    while(in_iter!=eof){
        *out_iter = *in_iter;
         out_iter++;
         in_iter++;
    }
}

输入:

代码语言:javascript
复制
aa bb cc 6 dd ee

输出:

代码语言:javascript
复制
aa bb cc 6 dd ee

Description:非常简单的代码。只是为了打印一些字符和输出将是相同的。然而,在"C++入门“一书中,如下图所示,它给了我们错误的代码。这是C++的错误,还是"C++ Primer“的错误?"C++底座“图片

EN

回答 1

Stack Overflow用户

发布于 2020-06-16 11:46:13

让我们拆开这个命令,看看发生了什么:

代码语言:javascript
复制
*out_iter++ = *in_iter++;

根据运算符优先,它也可以用以下方式编写

代码语言:javascript
复制
// read next value, but return unmodified iterator (with the previous value)
// the first value is read when the iterator is constructed!
auto x = in_iter++; 

// get value that was previously read
const auto res = *x; 

// print this value
*out_iter++ = res;

因此,基本上,它只在读取下一个值之后才会打印一个值。对于"a b c"的输入,会发生以下情况:

  1. 构造函数istream_iterator<string> in_iter(cin)读取"a"
  2. auto x = in_iter++;读取"b",但返回包含"a"的迭代器
  3. const auto res = *x;的结果是"a",然后打印出来。
  4. auto x = in_iter++;读取"c",但返回包含"b"的迭代器
  5. const auto res = *x;的结果是"b",然后打印出来。
  6. auto x = in_iter++;尝试读取某些内容,但是流缓冲区是空的,因此它等待进一步的输入。

到目前为止,只有"a b"被打印出来,"c"in_iter中被“卡住”。

如果流包含[eof] (例如,如果以某种方式终止流),则步骤6将不同,步骤7(和步骤8)将发生如下情况:

  1. auto x = in_iter++;读取[eof],成为eof迭代器,并返回包含"c"的迭代器。
  2. const auto res = *x;的结果是"c",然后打印出来。
  3. 循环终止

因此,这段代码并没有错,它只是没有做人们直觉所期望的事情。

另一方面,您的代码执行以下操作:

代码语言:javascript
复制
// extract first value that was read by the constructor and "prepare" to print
*out_iter = *in_iter; 

// read next value
out_iter++;

// print value
in_iter++;

这与预期的一样,因为它在读取新值之前确实会打印旧值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62404115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档