C++ 减量算子的奇异行为

C++ 减量算子的奇异行为,c++,C++,我的代码旨在反向打印数组,但由于某些原因,减量运算符没有按预期工作。根据我的理解,--var在对变量执行任何操作之前递减变量var,而var--在操作完成后递减变量var,例如for循环 这是我的密码: #include <iostream> int main() { int arrLen; int arr[4]; scanf("%d\n %d %d %d %d", &arrLen, &arr[0], &arr[1], &ar

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

这是我的密码:

#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;
}
如果未打印递减变量,则应为:

02341

以下是我的预期结果:


2 3 4 1

这种情况之所以不能如您所期望的那样运行,是因为
for
循环的工作方式

for (statement_1; condition; statement_2) {
    body;
}
语句_1
在循环开始之前只调用一次

条件
在循环的每个过程开始时进行评估。如果为真,则计算主体。如果没有,则循环退出

语句_2
在循环的每个过程结束时,在重新计算
条件之前,在
主体之后计算

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

这意味着
--var
var--
语句_2
的一部分时,对
for
循环的行为具有相同的影响

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

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

这并不像您所期望的那样,是因为
for
循环是如何工作的

for (statement_1; condition; statement_2) {
    body;
}
语句_1
在循环开始之前只调用一次

条件
在循环的每个过程开始时进行评估。如果为真,则计算主体
。如果没有,则循环退出

语句_2
在循环的每个过程结束时,在重新计算
条件之前,在
主体之后计算

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

这意味着
--var
var--
语句_2
的一部分时,对
for
循环的行为具有相同的影响

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

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

试着用下面的句子。我认为你的for循环不正确

for (; arrLen > 0; --arrLen) printf("%d %d\n", arr[arrLen - 1], arrLen);
它现在将具有以下输出

2 4
3 3
4 2
1 1

试着用下面的句子。我认为你的for循环不正确

for (; arrLen > 0; --arrLen) printf("%d %d\n", arr[arrLen - 1], arrLen);
它现在将具有以下输出

2 4
3 3
4 2
1 1

为什么在scanf()函数中使用“\n”?@M.SChaudhari检查int后接a\n这个问题是如何得到3张赞成票的?我不明白……@ZivS问不相关的问题没有意义,因为人们觉得它很有用,所以投票了。@JamesBalajan,这不是问题。如果有的话,那就是修辞。在我看来,您在调试\理解代码方面没有表现出任何努力,也没有表现出
操作员--
的工作方式。此外,这个问题本身本来可以用更好的措辞。我不知道一些事情是没有问题的,但是互联网上到处都是问这个问题和其他关于S.O.get down的问题的人,他们投票支持在scanf()中使用“\n”的方式function?@M.SChaudhari检查int后接a\n这个问题是如何得到3张赞成票的?我不明白….@ZivS问不相关的问题没有意义,因为人们觉得它很有用,所以投票了。@JamesBalajan,这不是一个问题。如果有的话,那就是修辞。在我看来,您在调试\理解代码方面没有表现出任何努力,也没有表现出
操作员--
的工作方式。此外,这个问题本身本来可以用更好的措辞。我不知道一些事情是没有问题的,但是互联网上到处都是问这个问题和其他关于S.O.get down的问题的人。投票结果很差,这会起作用,但它没有解决关于如何工作的潜在误解,但它没有解决关于如何工作的潜在误解
用于
工作