Когда пост-декремент / инкремент используется против пре-декремента / инкремента в реальных примерах?

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++.

Другие вопросы по тегам