将位置从第一个移到最后一个



我正在尝试制作一个简单的程序,将第一个位置移动到最后一个,直到:1 2 3 4 5 6看起来像:6 5 4 3 1

IDK为什么第二个for不工作

using namespace std;
int main() {
int x[6], a = 6, safe = 0;
cout<<"Value"<<endl;
for (int i = 0; i < 6; ++i) {
cin>>x[i];
}
for (int i = 0; i != 2; ++i) {
safe = x[i];
x[i] = x[a];
x[a] = safe;
a --;
}
for (int i = 0; i < 6; ++i) {
cout<<"[ "<<x[i]<<" ]"<<endl;
}
return 0;
}

问题:

  1. x[a]在第一次迭代时访问键外元素,这本身就是未定义行为。
  2. for (int i = 0; i != 2; ++i)完全没有意义。为什么条件是i != 2

解决方案:

你可以用std::reverse(std::reverse的文档在这里)来反转数组,而不是给自己制造很多麻烦。

如果你想手工制作它,它比你想象的要容易。只需将第二个for循环替换为:

for (int i = 0; i < length/2; ++i)
std::swap(x[i],x[length-i-1]);

用单个变量遍历数组,并将左边的值与右边的值交换。

附加信息:

  1. safe变量从不使用。你应该删掉它。
  2. 你可以使用std::array代替原始的C数组(std::array的文档在这里)。
  3. using namespace std;被认为是一个不好的做法(更多信息在这里)。

完整代码:

#include <iostream>
int main() {
constexpr int length = 6;
int x[length];
std::cout << "Value" << std::endl;
for (int i = 0; i < length; ++i)
std::cin >> x[i];
for (int i = 0; i < length/2; ++i)
std::swap(x[i],x[length-i-1]);
for (int i = 0; i < length; ++i)
std::cout<<"[ "<<x[i]<<" ]"<<std::endl;
return 0;
}

最新更新