Инкремент и декремент (increment, decrement) — унарные операции ++ и --,
увеличивающие или уменьшающие аргумент на 1. У каждой две формы — префиксная
++x и постфиксная x++. Меняют переменную они одинаково, а возвращают разное.
Зачем нужно
Операция в выражении работает в двух направлениях: возвращает значение и
производит побочный эффект. Инкремент хорошо показывает разницу между моментом
изменения переменной и возвращаемым значением. На практике ++i — штатный шаг
счётчика в цикле for.
Как работает
int x = 0;
x++; // постфиксный инкремент (x = 1)
++x; // префиксный инкремент (x = 2)
x--; // постфиксный декремент (x = 1)
--x; // префиксный декремент (x = 0)Применяются только к lvalue, как и присваивание:
++5; // error: lvalue required as increment operand
(x + 1)--; // error: lvalue required as decrement operandРазница — в возвращаемом значении:
- префиксная форма возвращает обновлённый аргумент — сам
x, lvalue; - постфиксная возвращает старое значение, до обновления.
int x = 0;
int a = ++x; // x стало 1, a получило 1
int b = x++; // b получило 1, затем x стало 2Отсюда и разное поведение в выражениях:
--x = 10; // Ok: --x — это сам x
x-- = 11; // ошибка компиляции
&(++x); // Ok
&(x++); // ошибкаСм. Категории значения.
Неточность в лонгриде L03
В лонгриде сказано, что постфиксные версии возвращают «старое значение lvalue». На деле это prvalue: старое значение в переменной уже не хранится, возвращается его копия. Иначе
x-- = 11и&(x++)компилировались бы, а они — нет (GCC 16.2:lvalue required).
Тонкости
- В отдельной строке
++x;иx++;делают одно и то же — значение никто не читает.
Не из лекции
- Кодстайл Google, на котором основан Кодстайл курса, советует префиксную форму, если старое значение не нужно:
++i, а неi++. Дляintразницы в скорости нет, но для сложных типов постфиксной форме приходится делать копию.- Менять одну переменную дважды в одном выражении (
x++ + x++,i = i++) не стоит: в части случаев это Неопределённое поведение, в остальных код просто трудно читать.
Частые ошибки
- Ожидать, что
b = x++запишет вbновое значение. - Применять
++к выражению:(x + 1)++.