Реализация операций постфиксного и префиксного инкремента и декремента на С++

Это своего рода пост-напоминалка для себя. Меня удивило, что я не смог найти по запросу о реализации постфиксного или префиксного инкремента или декремента примера кода. Поэтому я решил восполнить этот пробел сам.

Напомню, что:

инкремент (оператор ++) увеличивает значение числа на 1

декремент (оператор —)  уменьшает значение числа на 1.

Постфиксный — это означает то, что сначала над операндом (переменной) делаются какие-то операции, а уже после этого значение числа увеличивается или уменьшается. То есть, если у нас такая строчка: A = 5 * B—;, то это будет читаться так: умножить 5 на B и присвоить полученный результат переменной A, после чего уменьшить переменную B на единицу.

Префиксный — это противоположность постфиксному. Сначала оператор инкремента или декремента увеличивает или уменьшает операнд (переменную) и только после этого над ним производятся остальные операции, если они есть. То есть, если у нас такая строчка: A = 5 * —B;, то это будет читаться так: уменьшить значение переменной B на единицу, после чего умножить 5 на B и присвоить результат переменной A.

А вот как будет выглядеть реализация операций постфиксного и префиксного инкремента и декремента на C++:

template <class X>
//постфиксный инкремент
X incPost (X &x)
{
X val = x;
x = x+1;
return val;
}

template <class X>
//префиксный инкремент
X incPre(X &x)
{
x = x+1;
X val = x;
return val;
}

template <class X>
//постфикстный декремент
X decPost (X &x)
{
X val = x;
x = x-1;
return val;
}

template <class X>
//префиксный декремент
X decPre(X &x)
{
x = x-1;
X val = x;
return val;
}

Если вас пугают непонятные строчки template , то можете смело выкинуть их, и заменить везде X на любой другой, нужный вам тип данных.

Полезная статья? Их будет больше, если вы поддержите меня!

https://money.yandex.ru/embed/small.xml?account=410011399843532&quickpay=small&yamoney-payment-type=on&button-text=06&button-size=l&button-color=orange&targets=%D0%9F%D0%BE%D0%B4%D0%B4%D0%B5%D1%80%D0%B6%D0%B8%D0%B2%D0%B0%D1%8E+%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82+lexpenz.com&default-sum=50&successURL=

Архив комментариев

7 комментариев из прежней версии блога. Архив закрыт для новых ответов.

  1. не совсем понял зачем все это нужно, не проще ли писать a++ и a— или такие операторы не поддерживаются в Си?

    1. Такие операторы в семействе Си поддерживаются, но пример написан либо в Питоне, либо на JavaScript

  2. Rosskyавтор

    Это нужно будет, когда потребуется перегрузить операторы ++ и — для своего класса (как вариант, для MyBigInteger:)). Там, конечно будет уже operator++ или operator—, но «внутренность» их будет такой же.

  3. Андрей

    «если у нас такая строчка: A = 5 * –B»
    Опечатка тут, д.б.: A = 5 * -–B

    1. Нет, только с одним минусом, так как будет совершаться шаг с периодом 1, а не 0

  4. А зачем в префиксных вариантах временную переменную заводить? Она же не нужна там.

  5. Константин

    В префиксных вариантах временная переменная не нужна. В этом как раз и есть главное отличие постфиксного и префиксного инкремента. Постфиксный приводит к вызову копирующего конструктора.