Ostatnio spotkałem się z przyjacielem programistą w obecności naszych współmałżonek i jak to u programistów bywa, rozmowa w końcu zeszła na tematy kodu. Później zostałem zapytany przez żonę o to, czym jest inkrementacja oraz jaką różnicę czyni przedimek pre oraz post. O ile odpowiedź na pierwszą część pytania wydaje się banalna do wytłumaczenia dowolnemu laikowi, o tyle druga część może sprawić kłopot w zrozumieniu osobie nietechnicznej bez podania dobrego przykładu.

Załóżmy, że mamy w swoim kodzie zmienną x, której wartość wynosi 0. Inkrementacja tej zmiennej to nic innego jak zwiększenie jej wartości o 1. Dekrementacja, jak łatwo wywnioskować z nazwy, to operacja odwrotna, czyli zmniejszenie wartości o 1.

W języku Java inkremementację i dekrementację można zapisać za pomocą intuicyjnej konstrukcji odpowiednio x=x+1 oraz x=x-1. Zgodnie z maksymą, że dobry programista to leniwy programista, bardzo szybko reprezentanci tej grupy społecznej wymyślili, aby zastąpić wyrażenia +1 i -1 podwójnymi znakami plus oraz minus. Mimo, że na pierwszy rzut oka to żadna oszczędność, bo przecież zastępujemy 2 znaki 2 znakami. Okazuje się jednak, że jak zwykle, diabeł tkwi w szczegółach.

Pierwszy szczegół mówi o tym, że inkrementujemy zmienną, co oznacza, że przypisanie jest zbędne. Oznacza to, że x=x+1 jest dokładnie tym samym co ++x i analogicznie --x zastępuje x=x-1.

Drugi szczegół z kolei daje dowolność w zlokalizowaniu znaków inkrementacji lub dekrementacji przed lub po nazwie zmiennej, lecz równocześnie zmienia znaczenie w zależności od wybranej konstrukcji. Umieszczenie tych znaków przed zmienną jest nazywane preinkrementacją i predekrementacją, a odwrócenie kolejności powoduje powstanie postinkrementacji i postdekrementacji. Przedimek pre- mówi, że najpierw wykonujemy działanie, a dopiero potem zwracamy zmienną. Jak łatwo się domyślić, cząstka post- informuje, że najpierw następuje zwrócenie zmiennej, a dopiero potem działanie na niej.

Teoretycznie to wszystko co jest potrzebne do zrozumienia różnic pomiędzy preinkrementacją i postinkrementacją lub predekrementacją i postdekrementacją. Prawdopodobnie jednak, niewielu laików wie, czym jest "zwrócenie zmiennej", co niekoniecznie pozwoli na zrozumienie takiego wytłumaczenie. Na pomoc może przyjść tutaj druga zmienna, dajmy na to y, która będzie przechowywać wynik działania operacji. Jeśli przypiszemy wynik naszej operacji do tej zmiennej to konstrukcja zwracająca wynik po wykonaniu działania przypisze do niej ostateczny jego wynik. W przeciwnym wypadku, nasza zmienna otrzyma wartość zmiennej na której jest wykonywane działanie sprzed jego wykonania.

Inkrementacja
Wyrażenie Wynik

y = x + 1

x = 0, y = 1

Preinkrementacja

y = ++x

x = 1, y = 1

Postinkrementacja

y = x++

x = 1, y = 0

Dekrementacja
Wyrażenie Wynik

y = x - 1

x = 0, y = -1

Predekrementacja

y = --x

x = -1, y = -1

Postdekrementacja

y = x--

x = -1, y = 0