我正在使用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");
}
}
答案 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
。无符号整数环绕,因为它们没有负值的概念。