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

{lang: 'ru'}

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

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

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

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

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


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

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

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


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


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

    • Иван

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

  • Rossky

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

  • Андрей

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

    • Иван

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

  • Сергей

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

  • Константин

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