我编写了以下代码。而且产生了意想不到的结果!
#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条件!为什么会这样?
答案 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}}
像这样,代码将输入条件。