Разница между (++ i) и (i ++)

В С++ я понимаю, что (++i) должен возвращать ссылку на i, потому что необходимость конкатенации операторов, но я не могу понять:

Почему (i++) должен возвращать i по значению?

Кто-нибудь может прояснить.

Ответ 1

++i можно записать как

prefix_inc (this) {
   increase this by 1
   return this
}

Так как возвращается реальное i, мы можем обратиться к нему. Однако i++ выглядит как

postfix_inc (this) {
   set old_this = copy of this
   increase this by 1
   return old_this
}

as old_this - это просто локальная переменная, ссылка на нее бессмысленно после завершения i++. Поэтому логически он должен возвращать значение r.

Ответ 2

i++ возвращает значение, потому что оно возвращает старое значение i, а i увеличивается на 1.

Основной реализацией этого будет:

int i++() {
  int old = i;
  i = i + 1;
  return old;
}

Итак, если он вернул ссылку, это было бы неправильное значение... поскольку значение i было увеличено!

Ответ 3

Пусть foo - некоторая функция. foo(i++) вызывает foo(i) со старым значением i и увеличивает i, следовательно, необходимо создать временную копию. foo(++i) увеличивает i, а затем вызывает foo с добавочным значением, поэтому для повышения производительности мы можем повторно использовать одну и ту же переменную, не нужно иметь временную копию.

Ответ 4

я ++ Это возвращает значение я до того, как оно будет увеличено. Поэтому идея состоит в том, что если вы хотите использовать я в функции, а затем увеличивайте значение после ее использования, вы можете сделать это за один шаг. В качестве примера я хотел бы перегрузить этот оператор для целых чисел.

Integer Integer::operator++()
{
    Integer returnValue = *this;
    this->increment();
    return returnValue;
}

Таким образом, он увеличивает значение и затем возвращает то, что он использовал . Он также не возвращает ссылку, потому что возврат ссылки будет отличаться от того, что было первоначально передано, что разрушило бы каскадное.

++ я Это увеличивает значение i, а затем возвращает новое значение. Таким образом, вы можете использовать это в ситуации, когда вы хотите увеличить i, а затем использовать новое значение в своей функции.

Integer Integer::operator++(Integer i)
{
    i.increment();
    return i;
}

Таким образом, возвращаемое значение является увеличенным значением i.

Ответ 5

int i = 0;
Console.Writeline(i++); // Output 0, after that, i will be 1


int x = 0;
Console.Writeline(++x); // Output 1

Примечание: код находится на С#

Ответ 6

В то время как префикс ++i возвращает добавочное значение, а суффикс i++ возвращает старое значение и увеличивает его после этого, выбор оператора значителен, если вы заботитесь о цикле процессора. Приращение префикса выполняется быстрее; -)

Ответ 7

5 центов:

В результате i++ создания копии он медленнее для переменных без POD (т.е. итераторов). Вы должны использовать ++i где угодно, если это возможно.

Я всегда использую for(...;...;++i) вместо for(...;...;i++), хотя компилятор должен оптимизировать это.

Ответ 8

Если вы когда-либо находились в ситуации, когда это имеет значение, вы делаете это неправильно.