-3

次のコードは "hello world" を出力するような印象を受けましたが、何も出力しません。なんで?g++ 4.2.1 および cl++ 3.2 を使用してコンパイルされています。

void iterateBackwards(){
    std::string hiThere = "dlrow olleh";
    for ( int i = hiThere.length(); i == 0; i--) {
        std::cout << hiThere[i];
    }
}
4

4 に答える 4

5

あなたの条件はi >= 0, notである必要がありますi == 0(for条件が になるとすぐにループが終了しfalseます。これはあなたの例ではすぐに当てはまります)。

また、これを修正したらi、添字演算子はゼロベースのインデックスを受け入れるため、割り当ても同様に修正する必要があります。これはi == hiThere.length()、文字列のターミネータ文字にアクセスするときに、おそらく出力に関心がないことを意味します。

これはうまくいくはずです:

void iterateBackwards(){
    std::string hiThere = "dlrow olleh";
    for ( int i = hiThere.length() - 1; i >= 0; i--) {
        std::cout << hiThere[i];
    }
}

これが実際のです。

于 2013-04-27T18:36:14.593 に答える
2
  1. ループ内の条件は でなければなりませんi >= 0。そうしないと、プログラムがループの本体に入ることはありません。i == 0が trueiで、文字列の長さに設定されている限りループします。
  2. iで初期化する必要がありますhiThere.length() - 1。そうしないと、未定義の動作が発生します。C++ の文字列と配列は 0-index です。つまり、最初のインデックスは0で、最後のインデックスは ですsize - 1(hiThere[hiThere.length() - 1]の最後の要素もそうですhiThere)。
  3. C++ イテレータを調べる必要があります。

    void iterateBackwards(){
        std::string hiThere = "dlrow olleh";
        for (auto it = hiThere.crbegin(); it != hiThere.crend() ; ++it) {
            std::cout << *it;
        }
    }
    
于 2013-04-27T18:46:35.700 に答える
1

@AndyProwl はすでに解決策を提供しています。これをここにコピーして、私のものと比較しやすくします。

std::string hiThere = "dlrow olleh";
for ( int i = hiThere.length() - 1; i >= 0; i--) {
    std::cout << hiThere[i];
}

完全を期すために、そのように書くこともできます (また、その形式に遭遇する可能性が高いため、その形式を知っておく価値があります。これはAndy の解決策とまったく同じであることに注意してください)。

std::string hiThere = "dlrow olleh";
for (size_t i = hiThere.length(); i--; ) {
    std::cout << hiThere[i];
}

いくつかのコメント:

  • 負の値はもう必要ないので、符号なし (size_t) インデックスを使用できるようになりました。文字列が INT_MAX よりも長い場合、Andy のソリューションで何が起こるのでしょうか? (これが起こる可能性は非常に低いです。それは認めますが、それでも...) このフォームは、この小さな (実際には、衒学的な) ジレンマを解決します。
  • 終了条件と後付けは一緒にマージされるため、後付けは空のままになります。
  • 私たちが慣れ親しんでいるほとんどのループとは異なりfor、ここでは、通常のプレデクリメント演算子ではなく、ポストデクリメント演算子を使用することが非常に重要です。すべてがそれに依存しています。

しかし、正直なところ、STLの残りの部分との一貫性が高いという理由だけで、イテレータを使用した@woytazのソリューションを好みます。

于 2013-04-27T19:08:14.970 に答える
0

また、 for ループの条件は

i >= 0

それ以外の

i == 0

これは、for ループが true である限り反復し、i==0 を使用すると FALSE になるためです。

于 2013-04-27T18:38:49.913 に答える