天天看点

C++踩坑之vector的size比较

写代码时遇到vector的size比较,代码片截取修改如下

#include<iostream>
#include<vector>
using namespace std;
int main()
{	vector<int> A;
    A = { 2,-1,2 };
    int x = A.size() - 4;
    if (0<= A.size() - 4) {
        cout << "过程执行(本不应执行)" << endl;
    }
}
           

上述过程本不应执行,因为照我们理解

A.size()-4=-1

0>-1

if不成立,则不执行

而实际上A.size()-4不是-1

#include<iostream>
#include<vector>
using namespace std;
int main()
{	vector<int> A;
    A = { 2,-1,2 };
    int x = A.size() - 4;
    if (0<= A.size() - 4) {
        cout << A.size() - 4 << endl;
    }
}
           

结果为4294967295

因为A.size()的默认存储形式不是int,而是unsigned int, int为短整型,即有正负数之分,而A.size()不可能为负数,定义成了无符号短整型。所以当求A.size()-4时,默认数据格式跟随,发生下溢。即4294967295

要正常求得A.size()-4时,只需加上

int x = A.size() - 4;

强制类型转换

#include<iostream>
#include<vector>
using namespace std;
int main()
{	vector<int> A;
    A = { 2,-1,2 };
    int x = A.size() - 4;
    if (0<= x) {
        cout << "过程执行(本不应执行)" << endl;
    }
}
           

可以看到现在过程不执行了

继续阅读