Это своего рода пост-напоминалка для себя. Меня удивило, что я не смог найти по запросу о реализации постфиксного или префиксного инкремента или декремента примера кода. Поэтому я решил восполнить этот пробел сам.
Напомню, что:
инкремент (оператор ++) увеличивает значение числа на 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
Полезная статья? Их будет больше, если вы поддержите меня!
Архив комментариев
7 комментариев из прежней версии блога. Архив закрыт для новых ответов.
не совсем понял зачем все это нужно, не проще ли писать a++ и a— или такие операторы не поддерживаются в Си?
Такие операторы в семействе Си поддерживаются, но пример написан либо в Питоне, либо на JavaScript
Это нужно будет, когда потребуется перегрузить операторы ++ и — для своего класса (как вариант, для MyBigInteger:)). Там, конечно будет уже operator++ или operator—, но «внутренность» их будет такой же.
«если у нас такая строчка: A = 5 * –B»
Опечатка тут, д.б.: A = 5 * -–B
Нет, только с одним минусом, так как будет совершаться шаг с периодом 1, а не 0
А зачем в префиксных вариантах временную переменную заводить? Она же не нужна там.
В префиксных вариантах временная переменная не нужна. В этом как раз и есть главное отличие постфиксного и префиксного инкремента. Постфиксный приводит к вызову копирующего конструктора.