GCC产生了疯狂的计划

时间:2014-08-29 00:24:03

标签: c++ gcc

看一下这段代码:

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项目构建)

我是问题还是海湾合作委员会?

2 个答案:

答案 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并且大于容器的大小。