其他答案缺少现实世界中的示例,因此我将添加一个。我(个人)尝试避免使用无符号类型的原因之一。
考虑使用标准size_t作为数组索引:
for (size_t i = 0; i < n; ++i)
// do something here;
好的,完全正常。然后,考虑由于某些原因,我们决定更改循环的方向:
for (size_t i = n - 1; i >= 0; --i)
// do something here;
现在,它不起作用。如果我们将其int
用作迭代器,则不会有问题。在过去的两年中,我已经两次看到这样的错误。一旦它在生产中发生并且很难调试。
对我来说,另一个原因是令人讨厌的警告,它使您每次都这样写:
int n = 123; // for some reason n is signed
...
for (size_t i = 0; i < size_t(n); ++i)
这些都是次要的事情,但它们加起来。我觉得如果到处都只使用带符号的整数,代码会更干净。
编辑:
当然,这些示例看起来很愚蠢,但我看到有人犯了这个错误。如果有避免这种麻烦的简单方法,为什么不使用它呢?
当我用VS2015或GCC编译以下代码时,我看不到带有默认警告设置的警告(即使使用-Wall for GCC)。您必须请求-Wextra才能在GCC中获得有关此警告。这是您应该始终使用Wall和Wextra进行编译(并使用静态分析器)的原因之一,但是在许多现实生活项目中,人们却不这样做。
#include <vector>
#include <iostream>
void unsignedTest()
{
std::vector<int> v{ 1, 2 };
for (int i = v.size() - 1; i >= 0; --i)
std::cout << v[i] << std::endl;
for (size_t i = v.size() - 1; i >= 0; --i)
std::cout << v[i] << std::endl;
}
int main()
{
unsignedTest();
return 0;
}