C++ 修复向后数组.size()无符号整数

C++ 修复向后数组.size()无符号整数,c++,arrays,C++,Arrays,我想向后打印我的数组。为什么返回array.size()-1会给出最大的无符号长字符数 int main(){ array<double, 5> zArray = {}; for (unsigned int i = 0; i < zArray.size(); ++i) { cout << "Input "<< i+1 << ". Number: "; cin >> zArray.at(i); }

我想向后打印我的数组。为什么返回array.size()-1会给出最大的无符号长字符数

int main(){

  array<double, 5> zArray = {};

  for (unsigned int i = 0; i < zArray.size(); ++i) {
     cout << "Input "<< i+1 << ". Number: ";
     cin >> zArray.at(i);
  }

  cout << "Backwards" << endl;


  for (unsigned int j = zArray.size() -1; j >= 0; j--) {
     cout << zArray.at(j) << " ";
  }

  cout << endl;
}
intmain(){
数组zArray={};
for(无符号整数i=0;icout您的
for
循环永远不会结束。因为
j
无符号的
,它将始终大于或等于零。因此
j>=0
将始终为真

在从
无符号的
值中进行减法之前,您确实需要进行测试,以确保减法不会下溢。并且您的编译器应该警告您,比较将始终为真。

数组的
大小()
方法返回一个无符号值,因此,当您向后循环并达到索引0时,下一次迭代将
j
设置为
0-1
,这将环绕到无符号类型的最大值。这是语言的定义行为。因此
=0
条件将始终为真

std::out_of_range
错误是因为数组的
at()
方法执行边界检查,而换行的结果生成的值超出了数组定义的边界,正如错误消息所说的那样

可以通过使用迭代器而不是索引来避免这种情况:

int main(){
    array<double, 5> zArray = {};
    std::size_t idx = 0;

    for (auto &d : zArray) {
        cout << "Input " << idx + 1 << ". Number: ";
        cin >> d;
        ++idx;
    }

    cout << "Backwards" << endl;

    for (auto iter = zArray.rbegin(); iter != zArray.rend(); ++iter) {
        cout << *iter << " ";
    }

    cout << endl;
}
intmain(){
数组zArray={};
std::size\u t idx=0;
适用于(汽车与驱动:zArray){

cout因为这是unsigned int中的
-1
,它不仅仅是一个数学减法吗?还要注意STL容器
size()
sizeof())
函数返回实现定义的
size\t
。在流行的64位平台上,这被定义为
unsigned long
而不是
unsigned int
,因此
std::out\u of_range
。在使用STL时,最好让数据模型取决于实现。要回答类似的问题,请再次询问自己in:为什么不呢?你期望的是什么,为什么?然后研究每一个假设,直到找到错误的一个。这就是我们在堆栈溢出之前是如何进行软件开发的;)