递增和递减

递增和递减运算符允许以简化方式编写用于将操作数加/减 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++

1

-

后缀递减

e1--

2

++

前缀递增

++e1

2

-

前缀递减

--e1

所有递增和递减运算的优先级都高于算术运算。前缀的优先级低于后缀。在下面的例子中,x 的“旧”值与 y 值相加,随后对 x 进行递增。如果前缀优先级较高,将对 y 执行递增,此后将 x 与新值 6 相加,我们将得到 z = 6, x = 0(之前的值)。

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