我正在尝试制作一个简单的程序,将第一个位置移动到最后一个,直到: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;
}
问题:
x[a]
在第一次迭代时访问键外元素,这本身就是未定义行为。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]);
用单个变量遍历数组,并将左边的值与右边的值交换。
附加信息:
safe
变量从不使用。你应该删掉它。- 你可以使用
std::array
代替原始的C数组(std::array
的文档在这里)。 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;
}