2016-12-25 10 views
0

次のコードはcountを0として出力しますが、s.length()は11ですので10011とカウントしないでください。forループがスキップされています

int main() { 
    clock_t start_time = clock(); 
    string s = "hello world"; 
    int count = 0; 
    for (int i = -10000; i < s.length(); i++) { 
     count++; 
    } 
    cout << count << endl; 
    cout << clock() - start_time; 
    return 0; 
} 
+0

'int i'ではなく' unsigned int i'を試してください。 –

+0

まだ0を返す@barakmanos – wannabe

+2

[std :: string :: length'](http://en.cppreference.com/w/cpp/string/basic_string/size)によって返される型は* unsigned *です。符号付き整数と符号なし整数の比較は、期待通りに機能しない可能性があります。 –

答えて

0

あなたは典型的な署名-VS-符号なしの比較の失敗に実行されている - 頻繁の一つは、(1例えばComparison operation on unsigned and signed integersを参照)SOの質問をしました。

あなたは

for (int i = -10000; i != s.length(); i++) 

または後者の場合には、あなたがの範囲を制限しているが、符号付き整数の比較

for (int i = -10000; i < (int) s.length(); i++) 

を(強制的に代わり、リレーショナル比較の等価比較に切り替えることで、あなたのコードを修正することができます可能な長さは正当な理由なしに)。

しかし、一般に、符号付きの型と符号なしの型を比較して混合しないようにすることをお勧めします。コードを再設計しないようにしてください。

+0

@Someprogrammerdudeさんのコメントは、実際にはこのケースでは最善の答えであるとか、より正確には、実際の問題が「シーンの裏側」であることを意味していると思います(つまり、OPの考え方が間違っています)。 '-10000'は初期値から条件そのもの、すなわち' i

+0

それに加えて、私はこの種の問題で個人的に "厳しい"ものではありませんが、ここでは多くのユーザーがいます。質問にはC++のタグが付いているので、そのCスタイルのキャストを 'static_cast'に置き換えることができます。 .. –

+0

@barakマノス:私は問題としてそれを全く見ない。私はC++コード 'static_cast'はポインタキャストに予約されるべきだと考えています:階層的なアップキャストと' void * 'からのキャスト算術キャストは、上記のようにCスタイルのキャストで表現する必要があります。 – AnT

関連する問題