私は次のコードを持っています:
#include <iostream>
using 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 は失敗します。代わりに、テストは何とか合格しています。これはコンパイラのバグですか、それともどこかで未定義のことをしていますか?