先让大家看一段代码
#include <iostream>
using namespace std;
int main()
{
int i = -1;
size_t s = 1;
if (i >= s)
{
cout << "i >= s" << endl;
}
else
{
cout << "i < s" << endl;
}
return 0;
}
大家首次看到肯定会觉得输出i < s,我也是,但其实会输出i >= s。
这是因为C++进行了隐式类型转换,为了避免数据丢失,int类型会被提升为size_t类型。
-
混合类型比较:当您在条件语句中比较
int
类型的k
和size_t
类型的s
时,由于这两种类型不同,C++ 会执行一个隐式类型转换。 -
提升为无符号类型:在这种情况下,C++ 会将
int
类型的k
转换为size_t
类型。这是因为size_t
是无符号类型,而k
是有符号类型,为了避免潜在的数据丢失,C++ 选择将有符号类型提升为无符号类型。 -
具体转换过程:
k
的原始值是-1
,在转换为size_t
时,它会转成size_t
能表示的最大值(例如,在大多数系统上是UINT_MAX
,通常是4294967295
)。- 因此,比较
k >= s
的时候,实际上是在比较一个非常大的无符号整数和1
,结果显然为真。
大家可能会觉得我只要不用size_t类型和int类型进行比较就可以了,但其实有时候我们会用stl的一些函数返回值来进行比较,特别是size函数,它们的返回值都是size_t类型。例如:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> nums = { 0,1 };
int cur = -1;
if (cur >= nums.size())
{
cout << "cur >= nums.size()" << endl;
}
else
{
cout << "cur < nums.size()" << endl;
}
return 0;
}
所以为了规避这种情况可以有两种方法。
第一就是进行显示转换,将size_t转为int类型。
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> nums = { 0,1 };
int cur = -1;
if (cur >= (int)nums.size())
{
cout << "cur >= nums.size()" << endl;
}
else
{
cout << "cur < nums.size()" << endl;
}
return 0;
}
第二就是让一个int类型变量保存size_t类型。
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> nums = { 0,1 };
int cur = -1;
int size = nums.size();
if (cur >= size)
{
cout << "cur >= nums.size()" << endl;
}
else
{
cout << "cur < nums.size()" << endl;
}
return 0;
}
最后,希望大家都能规避这个错误。