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