为什么(0> v.size() - 1)对空向量求值为false?

时间:2013-09-15 15:16:34

标签: c++ vector

我正在使用vector做某事并发现以下条件被评估为false, 我无法理解。

代码如下:

#include "stdio.h"
#include <vector>

using namespace std;

int main()
{
   // an empty vector
   vector<int> v;

   // print 0
   printf ("size of the vector is %d \n", v.size());

   // the condition is false, why?
   if (0 > v.size()-1) {
       printf ("it should occur \n");
   }
}

4 个答案:

答案 0 :(得分:11)

这是混合有符号和无符号时会发生的情况。 v.size()会返回size_type,这是unsigned整数类型(很可能与std::size_t相同,通常是unsigned long (long)的typedef),所以v.size()-1 {1}}包裹,因为它永远不会是负数。

如果启用警告,编译器会告诉您正在混合已签名和未签名。对于GCC,-Wall启用相关警告(-Wsign-compare

答案 1 :(得分:3)

由于v.size()返回的是无符号类型的值,这意味着当v.size()0时,v.size()-1是一个非常大的正数。

答案 2 :(得分:3)

因为std::vector::size返回std::vector::size_type类型的值,这是无符号的。

warning: comparison of 0 > unsigned expression is always false [-Wtautological-compare]
   if (0 > v.size()-1) {
       ~ ^ ~~~~~~~~~~

答案 3 :(得分:2)

v.size()的返回类型是无符号类型:std::vector<int>::size_type,相当于std::size_t。无符号整数环绕,因为它们没有负值的概念。