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

时间:2018-08-19 05:09:05

标签: c++ if-statement vector

我编写了以下代码。而且产生了意想不到的结果!

#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条件!为什么会这样?

3 个答案:

答案 0 :(得分:9)

v.size()具有未签名的返回类型。从无符号的0减去1会导致回绕到一些“很大”的无符号的数字(这是模运算)。

0总是小于某些“非常大”的数字。

使用标准容器并混合带符号/无符号索引/大小时,这是常见的陷阱。

答案 1 :(得分:1)

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

尤其是,它被记录为返回size_type,通常将其类型定义为size_t,该数字是未签名的。

答案 2 :(得分:1)

unsigned 0<(v.size()-1) 整数值。如果您使其小于零,例如此处,您将获得非常大的正数,因为无符号整数在内存中的表示方式。

因此int确实是正确的。

仅出于实验目的,您可以将其强制转换为 signed if(0<(static_cast<int>(v.size())-1)) ,然后看看现在可以从条件表达式中获得期望的负值:

{{1}}

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