Очевидно, что когда вы хотите вернуть старое значение, вы используете post-increment.
Более тонкие вещи заключаются в том, что пре-инкремент на самом деле никогда не должен быть медленнее и может быть быстрее из-за отсутствия необходимости создавать временное и возвращать старое значение при использовании пост-инкремента.
Реальным сценарием использования пост-инкремента в 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++, то не просите его. Кроме того, я не уверен, что вы всегда получите такую же оптимизацию, если тип, который вы увеличиваете, не является простым типом. Подумайте об итераторах, которые не являются простыми указателями. В таких случаях оптимизация может быть разной. Короче говоря, всегда выполняйте предварительный инкремент, если вам не нужно возвращаемое (т.е. старое значение) оператора пост-инкремента.
Лучшее объяснение для прояснения различий:
В этом и заключается решающее различие: одно увеличивается ПОСЛЕ оценки утверждения, другое увеличивается ДО оценки утверждения.
Я предпочитаю использовать i ++
, если только мне не требуется поведение ++ i
, потому что при этом переменная помещается слева, что согласуется с i + = N
. В основном это второстепенно, но в циклах for я считаю ++ i
неправильным и заменю его на i ++
на проходе, потому что
for (i = 0; i < limit; ++i)
сбивает читателя с толку отсутствием параллельной структуры;
for (i = 0; i < limit; i++)
гораздо приятнее читать, потому что переменная цикла находится в одной и той же позиции во всех трех предложениях.
Аргументы из выступления - фигня. Любой достойный компилятор сгенерирует точно такой же код в случаях, когда разница не имеет значения. Да, это включает случаи, связанные с перегруженными операторами C ++.