【发布时间】:2017-07-27 13:39:57
【问题描述】:
在此代码示例中使用 int 而不是 std::size_t 时
std::vector<int> v {1,2,3,4};
for(int i = 0; i < v.size(); i++)
{
std::cout << v[i] << " ";
}
编译器生成以下警告:
warning: comparison between signed and unsigned integer expressions
但是程序按预期运行并输出:
1 2 3 4
我还经常在我正在从事的项目中注意到这些警告,这些警告已经运行多年,并且这些警告从未给我们的客户带来任何问题。由于显然这些程序在比较有符号和无符号整数方面没有问题,我想问一下:
- 在适用的情况下始终使用无符号整数是否有任何好处、性能或安全方面?
- 在什么情况下(如果有)比较有符号和无符号整数会导致错误或意外行为?
- 如果没有充分的理由担心这些警告,是否有任何历史原因,为什么这些信息可能对过去的开发人员有用?
【问题讨论】:
-
你可以(并且应该)通过写
for(size_t i = 0; i < v.size(); i++)来轻松修复该警告 -
有符号和无符号类型具有可在两种类型中表示的共同值范围。只要所有值都保持在该范围内,它就可以工作。一旦单个值超出该范围,它就会中断。
标签: c++ compiler-warnings