C++关于int与size_t比较的小陷阱

先让大家看一段代码

#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类型。

  1. 混合类型比较:当您在条件语句中比较 int 类型的 k 和 size_t 类型的 s 时,由于这两种类型不同,C++ 会执行一个隐式类型转换。

  2. 提升为无符号类型:在这种情况下,C++ 会将 int 类型的 k 转换为 size_t 类型。这是因为 size_t 是无符号类型,而 k 是有符号类型,为了避免潜在的数据丢失,C++ 选择将有符号类型提升为无符号类型。

  3. 具体转换过程

    • 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;
}

 最后,希望大家都能规避这个错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值