前缀或后缀增量(或减量)的用法

彼得

我发现以下代码是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无论IXCNT改变在每次循环的行程。只要ix的测试成功,我们就将下一个当前元素重置cnt的当前值

我对吗?还是我只是不了解此练习的目的?

Yu Hao

在这个示例中,使用前缀或后缀增量运算符是正确的,但是C ++ Primer还说,只有在真正必要时才使用后缀版本作为最佳实践,我引用了第4.5节中的内容。增减运算符

建议:仅在必要时使用Postfix运算符

C语言背景的读者可能会对我们在编写的程序中使用前缀增量感到惊讶。原因很简单:前缀版本可以避免不必要的工作。它增加值并返回增加的版本。后缀运算符必须存储原始值,以便它可以返回未增加的值作为结果。如果我们不需要增加的值,则不需要后缀运算符完成额外的工作。

对于ints和指针,编译器可以优化这些额外的工作。对于更复杂的迭代器类型,这种额外的工作可能会更加昂贵。通过习惯性地使用前缀版本,我们不必担心性能差异是否重要。此外,也许更重要的是,我们可以更直接地表达程序的意图。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

前缀或后缀增量(或减量)的用法

来自分类Dev

前缀和后缀增量

来自分类Dev

for循环中的前缀和后缀增量

来自分类Dev

stl迭代器的后缀和前缀增量之间的区别?

来自分类Dev

C中的前缀和后缀增量之间的差异(++ a和a ++)

来自分类Dev

为什么内置类型的链式前缀增量/减量对于C ++而言不是UB?

来自分类Dev

进度栏增量/减量

来自分类Dev

类计时器中的重载前缀和后缀增量。调试时出现问题

来自分类Dev

在C99中的复合文字中使用后缀/前缀增量运算符

来自分类Dev

R中的前缀后缀和前缀后缀

来自分类Dev

C#增量减量列表值

来自分类Dev

Firebase Ionic 5增量和减量

来自分类Dev

数字表冠旋转的增量/减量值

来自分类Dev

单行前/后增量减量评估

来自分类Dev

setNames后缀为前缀

来自分类Dev

for循环中的前缀与后缀

来自分类Dev

删除通用前缀或后缀

来自分类Dev

CMake库前缀/后缀

来自分类Dev

Excel前缀或后缀

来自分类Dev

前缀数等于后缀

来自分类Dev

前缀/后缀的Levenshtein距离的替代

来自分类Dev

提取“星号前缀”后缀的域

来自分类Dev

PySpark:带前缀/后缀的选择

来自分类Dev

方案编程语言中的增量和减量运算符

来自分类Dev

设置Android Studio(Kotlin)中的增量和减量限制

来自分类Dev

使用Redux输入的增量和减量计数器

来自分类Dev

单击增量/减量按钮后未显示Javascript公式结果

来自分类Dev

方案编程语言中的增量和减量运算符

来自分类Dev

X中增量/减量虚拟控制台的键绑定