c++ - 这是 C++ 中的错误吗?(书<> 可能是错的?)
问题描述
//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”的错误? 《C++入门》图片
解决方案
让我们拆开这个命令,看看发生了什么:
*out_iter++ = *in_iter++;
根据运算符的优先级,也可以写成如下方式:
// 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++;
这可以按预期工作,因为它确实会在读取新值之前打印旧值。
推荐阅读
- python - 如何在创建混淆矩阵时处理“ValueError:找到样本数量不一致的输入变量:[16979, 16976]”?
- java - 将分隔的字符串/文本转换为地图对象
- git - 为什么在使用单独的 git 目录时,包含 `.git` 目录的文件夹仍以某种方式与主工作树文件夹相关联?
- java - 为什么我的程序在加载的类中为方法“main”报告 NoSuchMethodException,但它确实存在?
- asp.net-mvc-4 - 对 Web api 的 Global.asax.cs 进行了更改,它正在调试但未发布
- javascript - 根据 Google 表格中先前的单元格值(真/假)保持空白单元格可见
- powershell - 如何在 VS Code 中为 Write-Debug 和 Write-Verbose 着色特定颜色?
- sql-server - SQL在触发器上更新父子关系
- python - 这是正确的吗?我希望有人可以帮助我嘿嘿
- javascript - 未找到模块:无法解析“./PlatformColorValueTypes”