Префиксные операторы увеличения и уменьшения ++ и --

++ unary-expression –– unary-expression

Заметки

Оператор префиксного инкремента (++) добавляет единицу к своему операнду; это инкрементированное значение является результатом выражения. Операнд должен иметь L-значение типа, отличного от const. Результат — L-значение того же типа, как у операнда.

Оператор префиксного декремента (––) аналогичен оператору префиксного инкремента, за исключением того, что операнд декрементируется на единицу и результатом является это декрементированное значение.

Операторы префиксных и постфиксных инкремента и декремента влияют на свои операнды. Они различаются между собой порядком выполнения инкремента или декремента при вычислении выражения (дополнительные сведения см. в разделе Операторы постфиксных инкремента и декремента). В префиксной форме инкремент или декремент выполняется до использования значения при вычислении выражения, поэтому значение выражения отличается от значение операнда. В постфиксной форме инкремент или декремент выполняется после использования значения при вычислении выражения, поэтому значение выражения совпадает со значением операнда. Например, в следующей программе выполняется вывод на печать "++i = 6".

// expre_Increment_and_Decrement_Operators.cpp
// compile with: /EHsc
#include <iostream>

using namespace std;

int main() {
   int i = 5;
   cout << "++i = " << ++i << endl;
}

Операнд целочисленного типа или типа с плавающей запятой инкрементируется или декрементируется на целое значение 1. Тип результата совпадает с типом операнда. Операнд типа указателя инкрементируется или декрементируется на значение размера объекта, к которому он относится. Инкрементированный указатель указывает на следующий объект, а декрементированный — на предыдущий.

Поскольку операторы инкремента и декремента имеют побочные эффекты, использование выражений с ними в макросе препроцессора может приводить к нежелательным результатам. Рассмотрим следующий пример.

// expre_Increment_and_Decrement_Operators2.cpp
#define max(a,b) ((a)<(b))?(b):(a)

int main()
{
   int i = 0, j = 0, k;
   k = max( ++i, j );
}

Макрос разворачивается до следующего выражения:

k = ((++i)<(j))?(j):(++i);

Если значение i больше или равно j или меньше j на 1, оно будет инкрементировано дважды.

Примечание

Встроенные функции C++ предпочтительнее макросов во многих случаях, поскольку исключают побочные эффекты, подобные описанным здесь, и позволяют языку выполнять более полную проверку типов.

См. также

Ссылки

Выражения с унарными операторами

Операторы C++

Операторы C++, приоритет и ассоциативность

Основные понятия

Префиксные операторы увеличения и уменьшения