8 ответов:
++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++. Поэтому логически он должен возвращать значение rvalue.
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с инкрементированным значением, поэтому для повышения производительности мы можем повторно использовать ту же переменную, не нужно иметь временную копию.
I++ Это возвращает значение i до того, как он увеличивается. Таким образом, идея заключается в том, что если вы хотите использовать i в функции, а затем увеличить значение после ее использования, вы можете сделать это за один шаг. В качестве примера, вот как я бы перегрузил этот оператор для целых чисел.
Integer Integer::operator++() { Integer returnValue = *this; this->increment(); return returnValue; }Таким образом, он увеличивает значение и затем возвращает то, что он использовал. Он также не возвращает ссылку, потому что возврат ссылки будет отличаться от того, что было первоначально передано, что приведет к разрыву каскадирование.
++i Это увеличивает значение 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Примечание: код находится в C#
В то время как префикс
++iвозвращает увеличенное значение, а префиксi++возвращает старое значение и увеличивает его впоследствии, выбор оператора важен, если вы заботитесь о циклах процессора. Приращение префикса происходит быстрее ; -)
5 центов:
Вследствие того, что
i++делает копию, она медленнее для не-POD переменных (т. е. итераторов). Вы должны использовать++iвезде, где это возможно.Лично я всегда использую
for(...;...;++i)вместоfor(...;...;i++), хотя компилятор должен оптимизировать это.
Comments