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

6
задан Community 23 May 2017 в 11:45
поделиться

3 ответа

Очевидно, что когда вы хотите вернуть старое значение, вы используете 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++, то не просите его. Кроме того, я не уверен, что вы всегда получите такую же оптимизацию, если тип, который вы увеличиваете, не является простым типом. Подумайте об итераторах, которые не являются простыми указателями. В таких случаях оптимизация может быть разной. Короче говоря, всегда выполняйте предварительный инкремент, если вам не нужно возвращаемое (т.е. старое значение) оператора пост-инкремента.

5
ответ дан 8 December 2019 в 15:58
поделиться

Лучшее объяснение для прояснения различий:

  • i++ - использовать значение i для любого значения, которое оно содержит, затем взять значение i, увеличить его и сохранить
  • ++i - увеличить значение i и сразу же сохранить его затем использовать это значение.

В этом и заключается решающее различие: одно увеличивается ПОСЛЕ оценки утверждения, другое увеличивается ДО оценки утверждения.

6
ответ дан 8 December 2019 в 15:58
поделиться

Я предпочитаю использовать i ++ , если только мне не требуется поведение ++ i , потому что при этом переменная помещается слева, что согласуется с i + = N . В основном это второстепенно, но в циклах for я считаю ++ i неправильным и заменю его на i ++ на проходе, потому что

for (i = 0; i < limit; ++i)

сбивает читателя с толку отсутствием параллельной структуры;

for (i = 0; i < limit; i++)

гораздо приятнее читать, потому что переменная цикла находится в одной и той же позиции во всех трех предложениях.

Аргументы из выступления - фигня. Любой достойный компилятор сгенерирует точно такой же код в случаях, когда разница не имеет значения. Да, это включает случаи, связанные с перегруженными операторами C ++.

4
ответ дан 8 December 2019 в 15:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: