gpt4 book ai didi

c++ - 这是C++中的错误吗? (本书《 C++入门》可能是错误的?)

转载 作者:行者123 更新时间:2023-12-01 14:52:18 25 4
gpt4 key购买 nike

//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”以及您喜欢的任何工具,以 交互模式运行上面的代码...)
aa bb cc 6 dd ee
输出:
aa bb cc 6 dd
实际上正确的代码应该是:
#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++;
}
}
输入:
aa bb cc 6 dd ee
输出:
aa bb cc 6 dd ee
说明:非常简单的代码。仅用于打印一些字符,输出将是相同的。但是,在“C++ Primer”这本书中,如下图所示,它为我们提供了错误的代码。是C++的错误还是“C++ Primer”的错误?
Picture of "C++ Primer"

最佳答案

让我们分解一下该命令,看看发生了什么:

*out_iter++ = *in_iter++;

根据 operator precedence,它也可以按以下方式编写:
// 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"的输入,发生以下情况:
  • 构造函数istream_iterator<string> in_iter(cin)读取"a"
  • auto x = in_iter++;读取"b",但返回包含"a"的迭代器
  • const auto res = *x;生成"a",然后将其打印出来。
  • auto x = in_iter++;读取"c",但返回包含"b"的迭代器
  • const auto res = *x;生成"b",然后将其打印出来。
  • auto x = in_iter++;尝试读取某些内容,但是流缓冲区为空,因此它等待进一步的输入。

  • 到目前为止,只打印了 "a b",并且 "c"被“塞住”了 in_iter

    如果流中包含 [eof](例如,如果您以某种方式终止了流),则第6步将有所不同,而第7步(和第8步)将发生:
  • auto x = in_iter++;读取[eof],成为eof-iterator并返回包含"c"的迭代器
  • const auto res = *x;生成"c",然后将其打印出来。
  • 循环终止

  • 因此,这段代码没有错,只是没有按照人们的直觉做。

    另一方面,您的代码执行以下操作:
    // 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++;

    这可以按预期工作,因为它在读取新值之前会打印旧值。

    关于c++ - 这是C++中的错误吗? (本书《 C++入门》可能是错误的?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62404115/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com