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

时间:2013-12-11 15:01:50

标签: c++

这是54345而不是54321? 我想如果N是5 - 我是3它的2减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];
   }
 }

2 个答案:

答案 0 :(得分:10)

  

这是54345而不是54321?我想如果N是5 - 我是3它的2减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]);
}

Live demo


当然,您可以通过简单地要求C ++标准库为您完成工作来避免所有

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

(感谢this last suggestion的@dasblinkenlight)

答案 1 :(得分:3)

这是代码逻辑的问题:一旦你这样做了

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

在第一次迭代中,1已经一去不复返了。您的阵列现在看起来像这样:

5 2 3 4 5

并且无法将1放回原处。该数组应该看起来像这样

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));