GCC生成了疯狂的程序
GCC generated crazy program
看看这段代码:
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,并且大于容器的大小。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- C++,系统无法执行指定的程序
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 重载操作程序时出错>>用于类中的字符串 memebr
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 试图在visual studio上用C++创建一个桌面应用程序
- 模板元程序查找相似的连续类型名称
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 如何通过cpp程序运行shell脚本
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- IPC使用多个管道和分支进程来运行Python程序
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- 使用C++程序合并排序没有得到正确的输出
- 基于boost的程序的静态链接——zlib问题
- 程序崩溃并显示"std::out_of_range"错误
- 在C应用程序中运行C++(带有STL)函数
- GCC生成了疯狂的程序
- 我的程序很疯狂,老实说我很困惑(c++)