我发现以下代码是C ++书籍(C ++ Primer,第5版)中使用逗号运算符的示例:
vector<int>::size_type cnt = ivec.size();
// assign values from size...1 to the elements in ivec
for(vector<int>::size_type ix = 0; ix != ivec.size(); ++ix, --cnt)
ivec[ix] = cnt;
我认为这不是一个合适的示例,因为在此,规避顺序和副作用并不重要。逗号运算符只允许分隔增量和减量表达式,这是逗号运算符的常用用法,但并非本书本节的目的。在cppreference.com上显示了一个更好的示例(请向下滚动到标题“内置逗号”运算符)。
我真正想到的是以下练习:
练习4.31本节中的程序使用了前缀递增和递减运算符。解释为什么我们使用前缀而不使用后缀。要使用后缀版本,必须进行哪些更改?使用后缀运算符重写程序。
在这种情况下,没有特殊的理由比后缀运算符更喜欢前缀。评估顺序无关紧要。在实践中,simple
类型对象的操作vector<int>::size_type
不应受益于前缀而不是后缀,因此,如果性能很重要,则首选前缀而不是后缀。
为了给您提供完整的上下文,请在本书的以下部分中进行操作:
4.10逗号运算符
的逗号操作符需要两个操作数,它评估由左到右。像逻辑与,逻辑或以及条件运算符一样,逗号运算符可保证其操作数的求值顺序。评估左手表达式,并取消其结果。逗号表达式的结果是其右手表达式的值。如果右侧操作数是左值,则结果是左值。逗号运算符的一种常见用法是在for循环中:
vector<int>::size_type cnt = ivec.size(); // assign values from size...1 to the elements in ivec for(vector<int>::size_type ix = 0; ix != ivec.size(); ++ix, --cnt) ivec[ix] = cnt;
此循环在for标头中的表达式中增加ix并减少cnt。无论IX和CNT改变在每次循环的行程。只要ix的测试成功,我们就将
下一个当前元素重置为cnt的当前值。
我对吗?还是我只是不了解此练习的目的?
在这个示例中,使用前缀或后缀增量运算符是正确的,但是C ++ Primer还说,只有在真正必要时才使用后缀版本作为最佳实践,我引用了第4.5节中的内容。增减运算符
建议:仅在必要时使用Postfix运算符
C语言背景的读者可能会对我们在编写的程序中使用前缀增量感到惊讶。原因很简单:前缀版本可以避免不必要的工作。它增加值并返回增加的版本。后缀运算符必须存储原始值,以便它可以返回未增加的值作为结果。如果我们不需要增加的值,则不需要后缀运算符完成额外的工作。
对于
int
s和指针,编译器可以优化这些额外的工作。对于更复杂的迭代器类型,这种额外的工作可能会更加昂贵。通过习惯性地使用前缀版本,我们不必担心性能差异是否重要。此外,也许更重要的是,我们可以更直接地表达程序的意图。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句