"C++ Primer"(第5版)建议在第149页上,简短的代码比较长的替代方案更不容易出错.它将以下代码行作为示例:
cout << *iter++ << endl;
Run Code Online (Sandbox Code Playgroud)
它声称上述行比其他行更不容易出错:
cout << *iter << endl;
++iter;
Run Code Online (Sandbox Code Playgroud)
对我来说,即使含义*iter++很明确,这个表达式仍然需要非零的心理努力来解析,因此第二个版本更具可读性.所以,我想理解:第二个版本更容易出错?
Vla*_*cow 22
我也不同意作者.
通常,每个代码段都会在将来发生变化.
例如这个陈述
cout << *iter++ << endl;
Run Code Online (Sandbox Code Playgroud)
可以通过以下方式进行更改
cout << *iter++ << ... << SomeFunction( *iter ) << endl;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,代码将具有未定义的行为,因为未指定函数参数的评估顺序.
所以在我看来这段代码片段
cout << *iter << endl;
++iter;
Run Code Online (Sandbox Code Playgroud)
不太容易出错.:)
在代码段中引入副作用并不会减少错误.
此外,在代码片段中,您显示迭代器的增量与输出其值之间没有逻辑关系.
cout << *iter++ << endl;
Run Code Online (Sandbox Code Playgroud)
因此不清楚为什么迭代器在此语句中递增.
将此语句分成两个语句会使代码片段更加清晰,因为增量似乎与代码的其他部分相关.
简洁使代码更具表现力.但这并不意味着它也必然会使代码更容易出错.:)
问题是,当你的函数在代码中包含几行时,它们中的每一行都被视为实现某个目标的"步骤".当你阅读这样一个函数时,你会阅读每一行并思考它的作用和原因.在你的例子中,
cout << *iter << endl;
++iter;
Run Code Online (Sandbox Code Playgroud)
逻辑上可以是一步:"当迭代容器时,将每个元素写入cout".这是因为当你忘记这些行中的任何一行时,整个步骤都是不正确的.当然,这个例子并不是特别好,因为提出代码并不难,其中两行是两个不同的逻辑步骤.但是,我认为作者的意思是,通过写作
cout << *iter++ << endl;
Run Code Online (Sandbox Code Playgroud)
你可以保护自己不会忘记逻辑步骤的一部分,也可以向读者发出信号,这是一个逻辑步骤.
小智 4
我可以考虑出于某种原因对行进行重新排序(也许它们被其他代码分隔开,然后进行了修改),或者添加了 if/for/while ,要么没有大括号,要么错误地放置了它们:
++iter;
cout << *iter << endl;
if (some_condition)
cout << *iter << endl;
++iter;
while (something_happens)
{
cout << *iter << endl;
}
++iter;
Run Code Online (Sandbox Code Playgroud)
在这个小示例中,错误非常明显,但当您有更多行时,情况可能并非如此。
(是的,我知道第二个和第三个示例中的缩进应该被纠正,但遗憾的是我见过很多这样的示例)。