看一下这段代码:
vector<Command*> list;
int cur = -1;
if( cur < (list.size()-1) )
{
cout<<"redo"<<endl;
++cur;
list[cur]->execute(text);
cout<<"pos: "<<cur<<" size: "<<list.size()<<endl;
}
else
{
cout<<cur<<" "<<(list.size()-1)<<" "<<( cur > (list.size()-1) )<<endl;
}
if(-1>2)
cout<<"true"<<endl;
else
cout<<"false"<<endl;
它的印刷:
-1 2 1
false
表示:
cur = -1
list.size()-1 = 2
cur > list.size()-1 == true
,即-1 > 2
但另一方如果说它是假的,数学也是这样说的。
我的GCC版本是:gcc版本4.8.0(rev2,由MinGW-builds项目构建)
我是问题还是海湾合作委员会?答案 0 :(得分:2)
可能cur
已签名且list.size
未签名。
然后在这个表达式中:
cur > (list.size()-1)
cur
会转换为无符号,因此值为true
。
您可以尝试这个简单的示例,c
获取值false
。
int a = -1;
unsigned int b = 1;
bool c = a < b;
答案 1 :(得分:1)
答案可以在5/9(二元运算符规则)中找到:
否则,应对两者进行整体促销(4.5) 操作数。然后,以下规则适用于晋升 操作数:
...
否则,两个操作数都应转换为无符号整数 类型对应于带有符号整数类型的操作数的类型
因此,在这种情况下,我们会对整体推广进行一系列规则,最后结束这一规则。这表示您的cur
将被提升为无符号(来自size
方法的返回类型),这是一个定义明确的操作来执行模运算。然后它将是最大的unsigned int并且大于容器的大小。