Бөлісу құралы:


Операторы добавочного и декремента префикса: ++--

Синтаксис

++ unary-expression
-- unary-expression

Замечания

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

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

Visual Studio 2017 версии 15.3 и более поздних версий (доступных в /std:c++17 режиме и более поздних версиях): операнд оператора добавочного или декремента может не быть типаbool.

Операторы префиксных и постфиксных инкремента и декремента влияют на свои операнды. Они различаются между собой порядком выполнения инкремента или декремента при вычислении выражения (Дополнительные сведения см. в разделе Операторы приращения и декремента.) В форме префикса приращение или уменьшение происходит до использования значения в оценке выражений, поэтому значение выражения отличается от значения операнда. В постфиксной форме инкремент или декремент выполняется после использования значения при вычислении выражения, поэтому значение выражения совпадает со значением операнда. Например, в следующей программе выполняется вывод на печать "++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++, приоритет и ассоциативность
Префиксные операторы увеличения и уменьшения