为什么当向量 v 为空时是 (0 < v.size()-1?



我写了下面的代码。它给出了意想不到的结果!

#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> v;
if(0 < (v.size() - 1))
cout << "entered" << endl;
return 0;
}

如果我们打印v.size()它打印 0。但它仍然进入 if 条件!为什么会这样??

v.size()具有无符号返回类型。从无符号 0 中减去 1 会导致换行到一些"非常大"的无符号数字(这是模算术(。

0 将始终小于某个"非常大"的数字。

在使用标准容器和混合有符号/无符号索引/大小时,这是一个常见的问题。

>v.size()返回无符号类型的值,因此减去一个将导致它下溢。

特别是,它被记录为返回size_type,这通常是typedef'dsize_t,它是无符号的。

>v.size()是一个unsigned整数值。如果你让它低于零,就像这里一样,你会得到一个非常大的正数,因为无符号整数在内存中的表示方式。

因此0<(v.size()-1)确实如此。

只是为了实验,你可以强制转换为有符号int,并看到现在你从条件表达式中得到了你期望的负值:

if(0<(static_cast<int>(v.size())-1))

像这样,代码将输入条件。

相关内容

最新更新