Разница между (++ i) и (i ++) - PullRequest
10 голосов
/ 18 июня 2010

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

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

Может кто-нибудь уточнить, пожалуйста.

Ответы [ 8 ]

27 голосов
/ 18 июня 2010

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

Базовая реализация этого будетbe:

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

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

19 голосов
/ 18 июня 2010

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

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

4 голосов
/ 18 июня 2010

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

2 голосов
/ 19 июня 2010

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

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

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

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

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

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

1 голос
/ 19 июня 2010
int i = 0;
Console.Writeline(i++); // Output 0, after that, i will be 1


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

Примечание: код на C #

0 голосов
/ 19 июня 2010

5 центов:

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

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

0 голосов
/ 19 июня 2010

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

0 голосов
/ 18 июня 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...