size() の型は

Xに、問題として上がっていたこんなコード(実際の問題とは違うが、要は i < v.size() – 1 の評価のところで。

#include <iostream>
#include <vector>

int main(void)
{
    std::vector<int> v;
    int count = 0;
    for (int i = 0; i < v.size() - 1; i++) {
        count++;
        std::cout << count << "\t" << i << "\t" << (v.size() - 1) << std::endl;
        if (count > 5) break;
    }
    return 0;
}

この結果は

1 0 18446744073709551615
2 1 18446744073709551615
3 2 18446744073709551615
4 3 18446744073709551615
5 4 18446744073709551615
6 5 18446744073709551615

となるわけで、iがint、v.size() – 1 はunsigned long なのだから、0から-1を引いても大きな値になっちゃうわけで、評価式は偽になりえないっちうわけで。

問題としては、この結果がどうなるか(無限ループ、SEGV、何も起きない、みたいな選択)ってことだけれど、まぁストッパがなければ無限ループになるわけで。

結論としては、イテレータ回せ、ってことで。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です