Инкремент и декремент
Операторы инкремента и декремента позволяют в упрощенном виде записать увеличение или уменьшение операнда на 1. Они чаще всего встречаются внутри циклов для модификации индексов при доступе к массивам и прочим объектам, поддерживающим перечисление.
Инкремент обозначается двумя подряд символами плюса '++'. Декремент обозначается двумя подряд минусами '--'.
Существует два вида таких операторов: префиксные и постфиксные.
Префиксные, как следует из названия, записываются перед операндом (++x, --x). Они изменяют значение операнда, и это новое значение участвует в дальнейшем расчете выражения.
Постфиксные записываются после операнда (x++, x--). Они подставляют в выражение копию текущего значения операнда, после чего производят изменение его величины (новое значение не попадает в выражение). Простые примеры приведены в скрипте ExprIncDec.mq5.
int i = 0, j;
|
Постфиксная форма бывает полезна для более компактной записи выражений, сочетающих обращение к предыдущему значению операнда и его побочную модификацию (альтернативная запись того же потребовала бы двух отдельных инструкций). Во всех остальных случаях рекомендуется использовать префиксную форму (она не создает временную копию "старого" значения).
В следующем примере у элементов массива последовательно меняется знак, пока не встретится нулевой элемент. Продвижение по индексам массива обеспечивает постфиксный инкремент k++ внутри цикла while. За счет постфикса, выражение a[k++] = -a[k] сначала обновляет k-й элемент, а затем увеличивает k на 1. Затем результат присваивания проверяется на неравенство нулю (!= 0, см. следующий раздел).
int k = 0;
|
В следующей таблице представлены операторы инкремента и декремента в порядке приоритета:
П |
Символы |
Описание |
Пример |
А |
---|---|---|---|---|
1 |
++ |
Постфикс инкремент |
e1++ |
L |
1 |
-- |
Постфикс декремент |
e1-- |
L |
2 |
++ |
Префикс инкремент |
++e1 |
R |
2 |
-- |
Префикс декремент |
--e1 |
R |
Все операции инкремента и декремента имеют более высокий приоритет, чем арифметические операции. Префиксы менее приоритетны, чем постфиксы. В следующем примере "старое" значение x суммируется со значением y, после чего x инкрементируется. Если бы приоритет префикса был выше, выполнился бы инкремент y, после чего новое значение 6 просуммировалось бы с x, и мы получили бы z = 6, x = 0 (прежний).
int x = 0, y = 5;
|