wtorek, 13 maja 2014

[C/C++] Pre-inkrementacja vs post-inkrementacja w pętli for

Którą wersję operatora inkrementacji powinniśmy stosować w pętli for i dlaczego?

Spójrzmy na dwa przykładowe kody:

for( int i = 0; i < 3; i++)
{
     std::cout << i << "\n";
}

for( int i = 0; i < 3; ++i)
{
     std::cout << i << "\n";
}

W obu przypadkach wynikiem będzie:

0
1
2

Krótkie przypomnienie: 
  • ++i - operator pre-inkrementacji, zwiększa wartość zmiennej i o jeden, następnie pobiera jej wartość
  • i++ - operator post-inkrementacji, pobiera wartość zmiennej i, następnie zwiększa jej wartość o jeden

Korzystniejsze jest jednak korzystanie z operatora pre-inkrementacji. Może być to nieco zaskakujące, ale jest to prawda. Pomyślmy o tym jak każda z wersji operatora inkrementacji działa, gdy to przeanalizujemy łatwo zauważyć że w przypadku post-inkrementacji istnieje potrzeba aby przechować gdzieś wartość która po zwróceniu zostanie zwiększona o 1, taka sytuacja nie występuje przy pre-inkrementacji gdzie od razu zwiększamy wartość a następnie ją zwracamy. Oznacza to zatem że kod generowany przy użyciu ++i jest bardziej wydajny niż przy i++, to samo dotyczy oczywiście operatora deinkrementacji.