Инкремент и декремент

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

Инкремент обозначается двумя подряд символами плюса '++'. Декремент обозначается двумя подряд минусами '--'.

Существует два вида таких операторов: префиксные и постфиксные.

Префиксные, как следует из названия, записываются перед операндом (++x, --x). Они изменяют значение операнда, и это новое значение участвует в дальнейшем расчете выражения.

Постфиксные записываются после операнда (x++, x--). Они подставляют в выражение копию текущего значения операнда, после чего производят изменение его величины (новое значение не попадает в выражение). Простые примеры приведены в скрипте ExprIncDec.mq5.

int i = 0j;
j = ++i;       // j = 1, i = 1
j = i++;       // j = 1, i = 2

Постфиксная форма бывает полезна для более компактной записи выражений, сочетающих обращение к предыдущему значению операнда и его побочную модификацию (альтернативная запись того же потребовала бы двух отдельных инструкций). Во всех остальных случаях рекомендуется использовать префиксную форму (она не создает временную копию "старого" значения).

В следующем примере у элементов массива последовательно меняется знак, пока не встретится нулевой элемент. Продвижение по индексам массива обеспечивает постфиксный инкремент k++ внутри цикла while. За счет постфикса, выражение a[k++] = -a[k] сначала обновляет k-й элемент, а затем увеличивает k на 1. Затем результат присваивания проверяется на неравенство нулю (!= 0, см. следующий раздел).

int k = 0;
int a[] = {12305};
while((a[k++] = -a[k]) != 0){}
// a[] = {-1, -2, -3, 0, 5};

В следующей таблице представлены операторы инкремента и декремента в порядке приоритета:

П

Символы

Описание

Пример

А

1

++

Постфикс инкремент

e1++

L

1

--

Постфикс декремент

e1--

L

2

++

Префикс инкремент

++e1

R

2

--

Префикс декремент

--e1

R

Все операции инкремента и декремента имеют более высокий приоритет, чем арифметические операции. Префиксы менее приоритетны, чем постфиксы. В следующем примере "старое" значение x суммируется со значением y, после чего x инкрементируется. Если бы приоритет префикса был выше, выполнился бы инкремент y, после чего новое значение 6 просуммировалось бы с x, и мы получили бы z = 6, x = 0 (прежний).

int x = 0y = 5;
int z = x+++y// "x++ + y" : z = 5, x = 1