Глиф Учебники

Разница между ++i и i++

Справочник · C++ · 1 минута чтения

Оба увеличивают i на единицу. Разница — в значении самого выражения:

C++
#include <iostream>
using namespace std;

int main() {
    int i = 5;
    int a = i++;        // a получает 5, потом i становится 6
    cout << a << " " << i << "\n";

    int j = 5;
    int b = ++j;        // j становится 6, b получает 6
    cout << b << " " << j << "\n";
    return 0;
}
Вывод
5 6
6 6

То же с уменьшением: --i и i--.

В цикле for разницы нет

C++
#include <iostream>
using namespace std;

int main() {
    for (int i = 0; i < 3; i++) {
        cout << i << " ";
    }
    cout << "\n";
    for (int i = 0; i < 3; ++i) {
        cout << i << " ";
    }
    cout << "\n";
    return 0;
}
Вывод
0 1 2
0 1 2

В заголовке цикла значение выражения i++ никуда не идёт — важно только то, что i увеличился. Поэтому оба цикла одинаковы, и для int компилятор делает из них один и тот же машинный код.

Разница бывает у сложных типов — например, у итераторов контейнеров (map, set). Для it++ приходится сохранять копию старого значения, а ++it обходится без неё. Поэтому многие привыкают писать ++it везде; для чисел это дело вкуса.

Когда разница видна

Только когда значение i++ или ++i используется в том же выражении:

C++
#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<int> v(3);
    int k = 0;
    v[k++] = 10;        // записать в v[0], потом k = 1
    v[k++] = 20;        // записать в v[1], потом k = 2
    cout << v[0] << " " << v[1] << " " << k << "\n";
    return 0;
}
Вывод
10 20 2

Запись v[k++] = x — короткий способ «положить в следующую свободную ячейку». Она встречается часто, но push_back у вектора делает то же понятнее.

Чего делать нельзя

Не меняйте одну переменную дважды в одном выражении: i++ + ++i, a[i] = i++ и подобное. Результат таких выражений не определён правилами языка или зависит от тонких правил порядка вычислений: разные компиляторы выдают разные ответы. С ключом -Wall g++ предупреждает об этом: operation on 'i' may be undefined.

Задачи «что выведет i++ + ++i» не имеют правильного ответа в C++. Пишите такие действия в разных строках — так понятно и человеку, и компилятору.