(b) if (i = 1024)
4.5. Операторы инкремента и декремента
Операторы инкремента (++
) и декремента (--
) позволяют в краткой и удобной форме добавить или вычесть единицу из объекта. Эта форма записи обеспечивает не только удобство, она весьма популярна при работе с итераторами, поскольку большинство итераторов не поддерживает арифметических действий.
Эти операторы существуют в двух формах: префиксной и постфиксной. До сих пор использовался только
int i = 0, j;
j = ++i; //
j = i++; //
Операндами этих операторов должны быть l-значения. Префиксные операторы возвращают сам объект как l-значение. Постфиксные операторы возвращают копию исходного значения объекта как r-значение.
Читатели с опытом языка С могли бы быть удивлены тем, что в написанных до сих пор программах использовался префиксный оператор инкремента. Причина проста: префиксная версия позволяет избежать ненужной работы. Она увеличивает значение и возвращает результат. Постфиксный оператор должен хранить исходное значение, чтобы возвратить неувеличенное значение как результат. Но если в исходном значении нет никакой потребности, то нет необходимости и в дополнительных действиях, осуществляемых постфиксным оператором.
Для переменных типа int
и указателей компилятор способен оптимизировать код и уменьшить количество дополнительных действий. Для более сложных типов итераторов подобные дополнительные действия могут обойтись довольно дорого. При использовании префиксных версий об эффективности можно не волноваться. Кроме того, а возможно и важнее всего то, что так можно выразить свои намерения более непосредственно.
Постфиксные версии операторов ++
и --
используются в случае, когда в одном составном выражении необходимо использовать текущее значение переменной, а затем увеличить его.
В качестве примера используем постфиксный оператор инкремента для написания цикла, выводящего значения вектора до, но не включая, первого отрицательного значения.
auto pbeg = v.begin();
//
while (pbeg != v.end() && *beg >= 0)
cout << *pbeg++ << endl; //
//
Выражение *pbeg++
обычно малопонятно новичкам в языках С++ и С. Но поскольку эта схема весьма распространена, программисты С++ должны понимать такие выражения.
Приоритет постфиксного оператора инкремента выше, чем оператора обращения к значению, поэтому код *pbeg++
эквивалентен коду *(pbeg++)
. Часть pbeg++
осуществляет инкремент указателя pbeg
и возвращает как результат копию предыдущего значения указателя pbeg
. Таким образом, операндом оператора *
будет неувеличенное значение указателя pbeg
. Следовательно, оператор выводит элемент, на который первоначально указывал указатель pbeg
, а затем осуществляет его инкремент.