我有以下代码:
#includeusing namespace std; int main(int argc, char *argv[]) { string a = "a"; for(unsigned int i=a.length()-1; i+1 >= 1; --i) { if(i >= a.length()) { cerr << (signed int)i << "?" << endl; return 0; } } }
如果我使用完全优化在MSVC中编译,我得到的输出是"-1?".如果我在调试模式下编译(没有优化),我没有输出(预期.)
我认为标准保证无符号整数以可预测的方式溢出,因此当i =(unsigned int)( - 1)时,i + 1 = 0,并且循环条件i + 1> = 1失败.相反,测试以某种方式通过.这是一个编译器错误,还是我在某处做某些未定义的事情?
我记得在2001年遇到这个问题.我很惊讶它仍然存在.是的,这是编译器错误.
优化者正在看到
i + 1 >= 1;
从理论上讲,我们可以通过将所有常量放在同一侧来优化它:
i >= (1-1);
因为我是无符号的,所以它总是大于或等于零.
在此处查看此新闻组讨论.