Jason. Cała informatyka w jednym miejscu!

Przerobimy sobie dzisiaj kolejne pojęcie dotyczące programowania, które będziecie często widzieć na oczy. Jest nim inkrementacja. Zapraszam głodnych wiedzy adeptów do środka po darmowy zastrzyk informacji, bez zastrzyku ;).

INKREMENTACJA KRYJE SIĘ POD DWOMA PLUSAMI

Termin jaki widzisz (pisany po angielsku "increment"), jest skrótem od znaczenia: zwiększ wartość liczbową zmiennej dokładnie o jeden do góry. To wszystko! Zapis programistyczny sprowadza się do umieszczenia dwóch plusików przed albo po nazwie zmiennej reprezentującej liczbę całkowitą (to jest warunek konieczny!). Kod pisany w języku C:

int i = 0;

i++;

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

++i;

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

Inkrementacja powoduje dosłowne zwiększenie wartości dokładnie o jeden do góry. Na wyjściu ujrzycie liczby 1 i 2. Jest to bardzo wygodny skrót dla następujących instrukcji dających identyczny rezultat:

i = i + 1;
i += 1;

To jest to samo. Muszę Was zmartwić, że nie wszystkie dzisiejsze języki programowania posiadają ten skrótowy operator. Python na przykład jest go pozbawiony (ojć!).

PATRZ GDZIE WSTAWIASZ PLUSY!

Jest drobny szczegół do opisania odnośnie wstawiania tych plusików. W momencie inkrementowania wartości tak jak wyżej, to nie będzie miało jakiegokolwiek znaczenia dla działania programu. Natomiast wstawienie w pętlę albo w dowolną instrukcję, w której następuje podstawienie ORAZ inkrementacja, już tak! Chodzi mi o dwa charakterystyczne przypadki, ten:

while (i++)
{
	// instrukcje
}

oraz ten:

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

Tutaj inkrementacja już będzie robiło OGROMNĄ, lecz mało widoczną różnicę w przebiegu działania programu! W tych powyższych przykładach najpierw zostanie odczytana wartość zmiennej, a dopiero wtedy podnoszona o jeden! Co ciekawe, kiedy wtrącimy plusiki za nazwą zmiennej:

while (++i)
{
	// instrukcje
}

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

To spowoduje to NAJPIERW zwiększenie i potem odczytanie wartości!!! Teraz pytanie jaka jest tego puenta. Dwa powyższe przykłady pokazują wrażliwość tzw. "punktów sekwencyjnych" na inkrementację. Punkt sekwencyjny to moment, w którym wszystkie skutki uboczne w danej linijce kodu zostały zakończone. Z kolei skutki uboczne to udane modyfikacje zmiennych. Ma to cholernie duże znaczenie kiedy łączycie odwoływanie się do wartości zmiennej ze zwiększeniem. Kiedy użyjecie niewłaściwej kolejności plusów, to mogą się stać różne cuda wianki. Iteracja w pętli pójdzie o jeden raz za dużo albo wyjdziecie poza zakres tablicy wstawiając za indeks zmienną.

Obczaj to bracie: dwa plusiki wstawione PO nazwie stanowią operator postinkrementacji. Kiedy umieścisz je PRZED nazwą, wtedy stosujesz preinkrementację. Jasne?

W swoich kodach źródłowych korzystam wyłącznie z preinkrementacji, tam gdzie się tylko da. Dlaczego? To już zapraszam do odrębnego wpisu na temat działania procesora wobec preinkrementacji a postinkrementacji.


Moi drodzy, to tyle z dzisiejszego artykułu! Inkrementacja jest bardzo użyteczną operacją, jednak nawet ona potrafi zaskoczyć w najmniej oczekiwanym momencie!

PODOBNE ARTYKUŁY