GCC生成了疯狂的程序

GCC generated crazy program

本文关键字:程序 疯狂 GCC      更新时间:2023-10-16

看看这段代码:

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

但另一个if说它是假的,数学也一样。

我的GCC版本是:GCC版本4.8.0(第2版,由MinGW构建项目)

我是问题还是GCC?

也许cur是有符号的,而list.size是无符号的。

然后在这个表达式中:

cur > (list.size()-1)

cur转换为无符号,因此值为true


您可以尝试这个简单的示例,c得到值false

int a = -1;
unsigned int b = 1;
bool c = a < b;

答案可以在5/9(二进制运算符规则)中找到:

否则,应在两者上执行整体促销(4.5)操作数。则以下规则应适用于晋升操作数:

否则,两个操作数都应转换为无符号整数与带符号整数类型的操作数类型相对应的类型

因此,在这种情况下,我们经历了一大堆关于整体推广的规则,最终得出了这个规则。这意味着您的cur将被提升为unsigned(来自size方法的返回类型),这是一个定义良好的执行模运算的操作。它将是最大的无符号int,并且大于容器的大小。