t0m*_*13b 6

澄清差异的最佳解释是:

  • i ++ - 将i的值用于它所拥有的任何值,然后取i的值,递增它并存储它
  • ++ i - 增加i的值并立即存储然后使用该值.

这是在评估语句之后递增的关键差异,另一个评估语句之前递增.


RC.*_*RC. 5

显而易见的是,当您想要返回旧值时,使用后增量.

更微妙的事情是,预增量应该真的永远不会更慢,并且可能更快,因为缺少创建临时值并在使用后增量时返回旧值.

在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 ++返回的值,则不要求它.此外,如果您的增量类型不是简单类型,我不确定您是否会始终获得相同的优化.认为迭代器不仅仅是普通的指针.在这种情况下,您的里程可能会因优化而有所不同.简而言之,除非您需要后增量运算符的返回值(即旧值),否则始终预先递增.


zwo*_*wol 5

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 次

最近记录:

15 年,4 月 前