Разница между постфиксом с шагом x++
и префиксом с шагом ++x
точно равна как оба оператора оценивают свои операнды. Постфиксный инкремент концептуально копирует операнд в память, увеличивает исходный операнд и, наконец, возвращает значение копии. Я думаю, что это лучше всего иллюстрируется реализацией оператора в коде:
int operator ++ (int& n) // postfix increment
{
int tmp = n;
n = n + 1;
return tmp;
}
Приведенный выше код не будет компилироваться, поскольку вы не можете переопределить операторы для примитивных типов. Компилятор также не может сказать, что здесь мы определяем оператор postfix вместо префикса , но давайте представим, что это правильный и действительный C ++. Вы можете видеть, что постфиксный оператор действительно действует на свой операнд, но он возвращает старое значение до приращения, поэтому результатом выражения x++
является значение до приращения. x
, однако, увеличивается .
Приращение префикса также увеличивает свой операнд, но оно возвращает значение операнда после приращения:
int& operator ++ (int& n)
{
n = n + 1;
return n;
}
Это означает, что выражение ++x
оценивается как значение x
после приращения.
Легко представить, что выражение ++x
, следовательно, эквивалентно assignmnet (x=x+1)
. Однако это не совсем так, потому что приращение - это операция, которая может означать разные вещи в разных контекстах. В случае простого примитивного целого числа, ++x
заменяется на (x=x+1)
. Но в случае типа класса, такого как итератор связанного списка, приращение префикса итератора определенно не означает «добавление единицы к объекту».