为什么这个c++输出与我预期的不同

Why is this c++ output different than what I expected?

本文关键字:c++ 输出 为什么      更新时间:2023-10-16

这是54345而不是54321?我想如果N是5-I,也就是3,它的2减1应该是1,我不明白它怎么会增加?

const int N = 5;
typedef int AList[N];
int main()
{
   AList A = {1, 2, 3, 4, 5};
   for (int I = 0; I < 5; I++) {
      A[I] = A[N-I-1];
   }
   for (int I = 0; I < 5; I++) {
      cout << A[I];
   }
 }

怎么是54345而不是54321?我想如果N是5-I,也就是3,它的2减1应该是1,我不明白它怎么会增加?

随着第一个循环的进行,您不是对其原始值进行操作,而是对在循环的早期迭代中已经处理过的值进行操作:

for (int I = 0; I < 5; I++) {
   A[I] = A[N-I-1];
}
  • 迭代1:将A[0]设置为A[4]=5
  • 迭代2:将A[1]设置为A[3]=4
  • 迭代3:将A[2]设置为A[2]=3
  • 迭代4:将A[3]设置为A[1]=4(以前是2,但您在迭代2中更改了它!)
  • 迭代5:将A[4]设置为A[0]=5(以前是1,但您在迭代1中更改了它!)

您需要两个阵列—来源目的地—为了正确地执行此操作,或者更高效地,在迭代到输入数组中点的循环上swap这些元素(而不是覆盖它们):

for (int i = 0; i < N/2; i++) {
   std::swap(A[i], A[N-i-1]);
}

现场演示


当然,你可以通过简单地要求C++标准库为你做这项工作来避免所有的

std::reverse(std::begin(A), std::end(A));

(感谢@dasblinkenlight最后的建议)

这是代码逻辑的问题:一旦完成

A[I] = A[N-I-1];

在第一次迭代中,1将永远消失。你的数组现在看起来是这样的:

5 2 3 4 5

并且没有办法将CCD_ 20放回原来的位置。阵列应该看起来像这个

5 2 3 4 1

这意味着您需要交换这两个元素。

一种正确的方法是循环到数组的中间,并使用交换而不是赋值(通过函数std::swap或自己编写交换)。

保留大部分代码的修复程序如下

for (int I = 0; I < 2 /*stop at the middle*/; I++) {
    std::swap(A[I], A[N-I-1]);
}

使用标准C++库充分发挥其潜力的修复方法是

std::reverse(std::begin(A), std::end(A));