Инкремент и декремент (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)++.