3

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

代码如下:

#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

4 回答 4

11

当您混合签名和未签名时会发生这种情况。v.size()返回 asize_type这是一个unsigned整数类型(很可能与 相同std::size_t,通常是 的 typedef unsigned long (long)),因此您可以v.size()-1回绕,因为它永远不会是负数。

如果您启用警告,编译器会告诉您您正在混合有符号和无符号。对于 GCC,-Wall启用相关警告(即-Wsign-compare

于 2013-09-15T15:18:53.840 回答
3

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

于 2013-09-15T15:18:44.520 回答
3

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

warning: comparison of 0 > unsigned expression is always false [-Wtautological-compare]
   if (0 > v.size()-1) {
       ~ ^ ~~~~~~~~~~
于 2013-09-15T15:20:30.790 回答
2

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

于 2013-09-15T15:18:31.103 回答