澄清差异的最佳解释是:
这是在评估语句之后递增的关键差异,另一个在评估语句之前递增.
显而易见的是,当您想要返回旧值时,使用后增量.
更微妙的事情是,预增量应该真的永远不会更慢,并且可能更快,因为缺少创建临时值并在使用后增量时返回旧值.
在C++中使用后增量的真实场景是从标准容器中删除时.例如:
set<int> ctr;
ctr.insert(1);
ctr.insert(10);
ctr.insert(12);
ctr.insert(15);
set<int>::iterator it = set.begin();
// Post-increment so the value returned to erase is that of the previous
// iteration (i.e. begin()), yet the iterator stays valid due to the local
// iterator being incremented prior to the erase call
ctr.erase(it++);
// Still valid iterator can be used.
cout << "Value: " << *it << "\n";
Run Code Online (Sandbox Code Playgroud)
为了响应编译器的优化,我认为尽可能准确地传达您想要实现的目标始终是重要的.如果您不需要从x ++返回的值,则不要求它.此外,如果您的增量类型不是简单类型,我不确定您是否会始终获得相同的优化.认为迭代器不仅仅是普通的指针.在这种情况下,您的里程可能会因优化而有所不同.简而言之,除非您需要后增量运算符的返回值(即旧值),否则始终预先递增.
i++除非我特别需要 的行为,否则我更喜欢使用++i,因为这会将变量放在左侧,与 一致i += N。大多数情况下,这是次要的,但在 for 循环中,我认为++i是错误的,并将其更改为i++en passant,因为
for (i = 0; i < limit; ++i)
Run Code Online (Sandbox Code Playgroud)
由于缺乏并行结构而使读者感到困惑;
for (i = 0; i < limit; i++)
Run Code Online (Sandbox Code Playgroud)
更容易阅读,因为循环变量在所有三个子句中都位于相同的位置。
从表现来看的论据纯属胡言乱语。在差异无关紧要的情况下,任何有价值的编译器都会生成完全相同的代码。是的,这包括涉及 C++ 重载运算符的情况。
| 归档时间: |
|
| 查看次数: |
2851 次 |
| 最近记录: |