Czym się różni preinkrementacja od postinkrementacji
Preinkrementacja i postinkrementacja różnią się nie tylko położeniem znaków plusa, ale również priorytetem "podnoszenia" liczby o 1.
INKREMENTACJA OD STRONY CPU
Dwa słowa wyjaśnienia na temat zachowania przez procesor zanim skończę. Większość programistów zaleci Wam, aby dużo częściej jeśli nie zawsze, korzystać z preinkrementacji. Jest w tym pewny powód, a dotyczy on operacji procesora. Stosując postinkrementację procesor musi wpierw utworzyć kopię tej liczby przed inkrementacją w celu zachowania nienaruszonej liczby podczas wykonywania instrukcji przed dotarciem do punktu sekwencyjnego, który omówiłem w poprzednim akapicie. Po jego przekroczeniu, następuje zwiększenie o 1. Natomiast, preinkrementacja to sygnał dla CPU, że trzeba jedynie podnieść ten sam licznik do góry i od razu ma on być uwzględniany jeszcze przed punktem sekwencyjnym.
Właśnie dlatego w warunku pętli ma to kolosalne znaczenie czy dorzucimy plusiki na końcu czy na początku, ponieważ przy postinkrementacji następuje najpierw sprawdzenie warunku czy liczba nie jest większa czy mniejsza i dopiero wtedy jest zwiększenie, a gdy wykorzystywana jest preinkrementacja, pierwszeństwo ma zwiększenie licznika, a dopiero potem jest sprawdzenie warunku. Jest to jedna z najważniejszych różnic do zaobserwowania, ponieważ większość początkujących może z tego korzystać i nie wiedzieć jakie konsekwencje ma użycie jednego lub drugiego zapisu.
#include <iostream>
using namespace std;
int main()
{
int k, i;
cout << "Ta sama petla rozne przypadki.\n";
i = 0;
cout << "\ni=0 ++i\n";
for (k=0; k<10; ++k)
cout << ++i << " ";
i = 0;
cout << "\n\ni=0 i++\n";
for (k=0; k<10; ++k)
cout << i++ << " ";
i = 0;
cout << "\n\ni=0 i=i+1\n";
for (k=0; k<10; ++k)
cout << (i=i+1) << " ";
i = 0;
cout << "\n\ni=0 i+=1\n";
for (k=0; k<10; ++k)
cout << (i+=1) << " ";
cout << "\n\nbonus ;-)";
i = 0;
cout << "\ni=0 i+=2 , i+=3 itd.\n";
for (k=0; k<10; ++k)
cout << (i+=2) << " ";
return 0;
}
