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



我想向后打印我的数组。为什么 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;
}

当我用普通整数替换 for 循环时,程序工作正常。为什么无符号的 int 返回错误std::out_of_range最大值为 4294967295 ?array.size() 的返回值是否是无符号的 int?

完整错误:terminate called after throwing an instance of 'std::out_of_range' what(): array::at: __n (which is 4294967295) >= _Nm (which is 5)

你的for循环永远不会结束。因为junsigned的,它将永远大于或等于零。所以j >= 0永远是真的。

在从unsigned值中减去之前,您确实需要进行测试以确保减法不会溢出。你的编译器应该给你一个警告,比较将永远是正确的。

数组的 size() 方法返回一个无符号值,因此当您向后循环并达到索引 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;
}

最新更新