Jason. Cała informatyka w jednym miejscu!

Było o inkrementacji, to teraz druga strona medalu. Odejmowanie w skróconej formie czyli dekrementacja. Wchodź i dowiaduj się więcej, bo to Ci się bardzo przyda podczas pisania!

DEKREMENTACJA ROBI TO SAMO, TYLKO W DRUGĄ STRONĘ...

Znaczenie terminu "decrement" brzmi bardzo podobnie co inkrementacja, przyjacielu: zmniejsz wartość liczbową zmiennej dokładnie o jeden do dołu. Nic więcej! W kodzie źródłowym używamy dwóch minusów przed albo po nazwie zmiennej (bez odstępu). Nie muszę pisać, że wolno Wam to umieścić wyłącznie dla zmiennych reprezentujących "integer" w jakiejkolwiek formie ("unsigned", "long" itd.). Oto kod w języku C, jak to w artykułach o ogólnych zagadnieniach dotyczących programowania:

int i = 2;

i--;

printf("%d\n", i);

--i;

printf("%d\n", i);

Dekrementacja do tego się sprowadza. Wstaw dwa minusy przed zmienną w postaci liczby całkowitej, a wartość zostanie obniżona dokładnie o jeden, co sprawi że na wyjściu zobaczymy nic innego jak liczby 1 i 0 (zero). To jest to samo, co te dłuższe instrukcje:

i = i - 1;
i -= 1;

tylko mniej piszesz ;)!

NIE WSTAWIAJ MINUSÓW WEDŁUG SWOJEGO WIDZIMISIĘ

Powtórzę się w sprawie wstawiania znaczków. Sama dekrementacja, jeżeli obchodzi się bez żadnego mieszania innych fragmentów w jednej instrukcji, nie ma znaczenia czy jest "post", czy "pre". ALE! Spróbujcie wstawić minusy (najpierw przed nazwą, a potem po nazwie) dla tych przykładowych instrukcji:

while (i--)
{
	// instrukcje
}

oraz tej:

printf("%d\n", i--);

i gwarantuję Wam, że to "założy togę" z napisem "game changer"! Kombinacje odczytu z dekrementacją mogą dać różne wyniki w zależności od tego, czy będzie to predekrementacja (dwa minusy przed nazwą), czy postdekrementacja (dwa minusy za nazwą). Dla pętli "while" sprawi to jedną iterację różnicy, a dla "printf" wyświetlenie wartości nietkniętej lub "obciętej" o jedną jednostkę. Także miarkuj się kolego w jaki sposób dekrementujesz liczby całkowite! Ciekawy skąd się to bierze?

W języku C występuje termin "punkt sekwencyjny", który oznacza moment zakończenia wszystkich modyfikacji zmiennych (skutków ubocznych). Jest on bardzo "czuły" na miksy instrukcji odczytujących wartości z jej modyfikacją. Kiedy on "zobaczy" postdekrementację, to NAJPIERW użyje wartości aktualnej, a POTEM modyfikuje. Przy predekrementacji jest dokładnie odwrotnie (NAJPIERW edycja, POTEM odczyt).

Kiedy tylko mogę, używam wyłącznie predekrementacji z powodu różnego zachowania się procesora w obu sytuacjach. Zapraszam do odrębnego artykułu o preinkrementacji i postinkrementacji co się wtedy dzieje w pececie za naszymi plecami.


Wszystko na ten temat! Dekrementacja powinna być jak najczęściej używana, a uwierzcie mi że przy odpowiednim wstawieniu minusików, możemy skutecznie skrócić liczbę linijek kodu!

PODOBNE ARTYKUŁY