Inkrementacja i dekrementacja
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.
Wyrażenie | Wynik | |
---|---|---|
|
|
|
Preinkrementacja |
|
|
Postinkrementacja |
|
|
Wyrażenie | Wynik | |
---|---|---|
|
|
|
Predekrementacja |
|
|
Postdekrementacja |
|
|