Операторы добавочного и декремента префикса: ++
--
Синтаксис
++ 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++, приоритет и ассоциативность
Префиксные операторы увеличения и уменьшения