递减运算符的奇怪行为

Strange behaviour with decrement operator

本文关键字:运算符      更新时间:2023-10-16

我的代码旨在反向打印数组,但由于某种原因,递减运算符无法按预期工作。根据我的理解--var在对变量执行任何操作之前递减变量var,而var--在完成操作(例如for循环(后递减变量var

这是我的代码:

#include <iostream>
int main() {
    int arrLen;
    int arr[4];
    scanf("%dn %d %d %d %d", &arrLen, &arr[0], &arr[1], &arr[2], &arr[3]);
    for (; arrLen >= 0; --arrLen)
        printf("%d %dn", arr[arrLen], arrLen);
    return 0;
}

这是我的结果(输出中的正确值是递减变量,我添加了它来检查(:

0 4
2 3
3 2
4 1
1 0

如果不打印递减变量,它应该是:

0 2 3 4 1

以下是我的预期结果:

2 3 4 1

这没有按预期运行的原因是因为for循环的工作方式。

for (statement_1; condition; statement_2) {
    body;
}

statement_1 仅在循环开始之前调用一次。

condition在循环中每个遍历的开头进行评估。如果为真,则评估body。如果不是,循环将退出。

statement_2在循环中每次通过结束时的body进行评估,就在重新评估condition之前。

因此,虽然--var确实递减并返回递减值,但每次运行时,它仅在for循环的主体之后实际调用。

这意味着当--varvar--的一部分statement_2时,将对for循环的行为产生相同的影响。

要产生您想要的行为,您可以将 for 循环更改为:

while (--arrLen >= 0)
    printf("%d %dn", arr[arrLen], arrLen);

尝试使用以下行。我认为你的 for 循环不合适。

for (; arrLen > 0; --arrLen) printf("%d %dn", arr[arrLen - 1], arrLen);

它现在将具有以下输出

2 4
3 3
4 2
1 1