В С++ я понимаю, что (++i)
должен возвращать ссылку на i
, потому что необходимость конкатенации операторов, но я не могу понять:
Почему (i++)
должен возвращать i
по значению?
Кто-нибудь может прояснить.
В С++ я понимаю, что (++i)
должен возвращать ссылку на i
, потому что необходимость конкатенации операторов, но я не могу понять:
Почему (i++)
должен возвращать i
по значению?
Кто-нибудь может прояснить.
++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.
i++
возвращает значение, потому что оно возвращает старое значение i
, а i
увеличивается на 1
.
Основной реализацией этого будет:
int i++() {
int old = i;
i = i + 1;
return old;
}
Итак, если он вернул ссылку, это было бы неправильное значение... поскольку значение i
было увеличено!
Пусть foo
- некоторая функция. foo(i++)
вызывает foo(i)
со старым значением i
и увеличивает i
, следовательно, необходимо создать временную копию. foo(++i)
увеличивает i
, а затем вызывает foo
с добавочным значением, поэтому для повышения производительности мы можем повторно использовать одну и ту же переменную, не нужно иметь временную копию.
я ++ Это возвращает значение я до того, как оно будет увеличено. Поэтому идея состоит в том, что если вы хотите использовать я в функции, а затем увеличивайте значение после ее использования, вы можете сделать это за один шаг. В качестве примера я хотел бы перегрузить этот оператор для целых чисел.
Integer Integer::operator++()
{
Integer returnValue = *this;
this->increment();
return returnValue;
}
Таким образом, он увеличивает значение и затем возвращает то, что он использовал . Он также не возвращает ссылку, потому что возврат ссылки будет отличаться от того, что было первоначально передано, что разрушило бы каскадное.
++ я Это увеличивает значение i, а затем возвращает новое значение. Таким образом, вы можете использовать это в ситуации, когда вы хотите увеличить i, а затем использовать новое значение в своей функции.
Integer Integer::operator++(Integer i)
{
i.increment();
return i;
}
Таким образом, возвращаемое значение является увеличенным значением i.
int i = 0;
Console.Writeline(i++); // Output 0, after that, i will be 1
int x = 0;
Console.Writeline(++x); // Output 1
Примечание: код находится на С#
В то время как префикс ++i
возвращает добавочное значение, а суффикс i++
возвращает старое значение и увеличивает его после этого, выбор оператора значителен, если вы заботитесь о цикле процессора. Приращение префикса выполняется быстрее; -)
5 центов:
В результате i++
создания копии он медленнее для переменных без POD (т.е. итераторов). Вы должны использовать ++i
где угодно, если это возможно.
Я всегда использую for(...;...;++i)
вместо for(...;...;i++)
, хотя компилятор должен оптимизировать это.
Если вы когда-либо находились в ситуации, когда это имеет значение, вы делаете это неправильно.