Разница между ++i и i++
Оба увеличивают i на единицу. Разница — в значении самого выражения:
++i(префиксный) — сначала увеличивает, потом отдаёт новое значение;i++(постфиксный) — отдаёт старое значение, а увеличивает после.
#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 разницы нет
#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 используется в том же выражении:
#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++. Пишите такие действия в разных строках — так понятно и человеку, и компилятору.