Операции инкремента (++) и декремента (--) дают возможность компактной и удобной записи для изменения значения переменной на единицу. Чаще всего они используются при работе с массивами и коллекциями – для изменения величины индекса, указателя или итератора:
#include <vector>
#include <cassert>
int main()
{
int ia[10] = {0,1,2,3,4,5,6,7,8,9};
vector<int> ivec( 10 );
int ix_vec = 0, ix_ia = 9;
while ( ix_vec < 10 )
ivec[ ix_vec++ ] = ia[ ix_ia-- ];
int *pia = &ia[9];
vector<int>::iterator iter = ivec.begin();
while ( iter != ivec.end() )
assert( *iter++ == *pia-- );
}
Выражение
ix_vec++
является постфиксной
формой оператора инкремента. Значение переменной ix_vec увеличивается после того, как ее текущее значение употреблено в качестве индекса. Например, на первой итерации цикла значение ix_vec равно 0. Именно это значение применяется как индекс массива ivec, после чего ix_vec увеличивается и становится равным 1, однако новое значение используется только на следующей итерации. Постфиксная форма операции декремента работает точно так же: текущее значение ix_ia берется в качестве индекса для ia, затем ix_ia уменьшается на 1.
Существует и префиксная форма этих операторов. При использовании такой формы текущее значение сначала уменьшается или увеличивается, а затем используется новое значение. Если мы пишем:
// неверно: ошибки с границами индексов в
// обоих случаях
int ix_vec = 0, ix_ia = 9;
while ( ix_vec < 10 )
ivec[ ++ix_vec ] = ia[ --ix_ia ];
значение ix_vec увеличивается на единицу и становится равным 1 до первого использования в качестве индекса. Аналогично ix_ia получает значение 8 при первом использовании. Для того чтобы наша программа работала правильно, мы должны скорректировать начальные значения переменных ix_ivec и ix_ia:
// правильно
int ix_vec = -1, ix_ia = 8;
while ( ix_vec < 10 )
ivec[ ++ix_vec ] = ia[ --ix_ia ];