可能重复:
Why use ++i instead of i++ in cases where the value is not used anywhere else in the statement?
Incrementing in C++ - When to use x++ or ++x?
i++ vs. ++i
这在真实场景中何时使用?
答案 0 :(得分:6)
为澄清差异,最好的解释是:
这是一个关键的差异,一个增量 AFTER 评估语句,另一个增加 BEFORE 评估语句。
答案 1 :(得分: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";
为了回应编译器的优化,我认为尽可能准确地传达你想要完成的事情总是很重要的。如果您不需要从x ++返回的值,则不要求它。此外,如果您的增量类型不是简单类型,我不确定您是否会始终获得相同的优化。认为迭代器不仅仅是普通的指针。在这种情况下,您的里程可能会因优化而有所不同。简而言之,除非您需要后增量运算符的返回值(即旧值),否则始终预先递增。
答案 2 :(得分:4)
我更喜欢使用i++
,除非我特别需要++i
的行为,因为这会将变量放在左侧,与i += N
一致。大多数情况下这是次要的,但在for循环中,我认为++i
错误并将其更改为i++
en passant,因为
for (i = 0; i < limit; ++i)
由于缺乏并行结构而引起读者的兴趣;
for (i = 0; i < limit; i++)
读取更好,因为循环变量在所有三个子句中处于相同的位置。
表演的争论很糟糕。任何值得盐的编译器都会在差异无关紧要的情况下生成完全相同的代码。是的,这包括涉及C ++重载运算符的案例。