我想向后打印我的数组。为什么 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
循环永远不会结束。因为j
是unsigned
的,它将永远大于或等于零。所以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;
}