使用递减运算符的奇怪行为

Jam*_*jan 1 c++

我的代码是为了打印反向的数组,但由于某种原因,如预期的那样减运算符不能正常工作.根据我的理解--var,var在完成操作之前递减变量,然后在完成操作(例如循环)之后var--递减变量.varfor

这是我的代码:

#include <iostream>

int main() {
    int arrLen;
    int arr[4];
    scanf("%d\n %d %d %d %d", &arrLen, &arr[0], &arr[1], &arr[2], &arr[3]);
    for (; arrLen >= 0; --arrLen)
        printf("%d %d\n", arr[arrLen], arrLen);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

0 4
2 3
3 2
4 1
1 0
Run Code Online (Sandbox Code Playgroud)

如果没有打印的递减变量,它应该是:

0 2 3 4 1

以下是我的预期结果:

2 3 4 1

sok*_*oku 7

这不符合您的预期的原因是因为for循环如何工作.

for (statement_1; condition; statement_2) {
    body;
}
Run Code Online (Sandbox Code Playgroud)

statement_1 在循环开始之前只调用一次.

condition在循环中每次传递开始时进行评估.如果是,body则进行评估.如果不是,循环退出.

statement_2评估body循环中在各端通过刚刚重新评估之前,condition.

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

这意味着,--varvar--将有一个行为同样的效果for环路时部分statement_2.

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

while (--arrLen >= 0)
    printf("%d %d\n", arr[arrLen], arrLen);
Run Code Online (Sandbox Code Playgroud)