0

更新: 助けてくれてありがとう。あなたが実行できるデモを書くことは、問題の解決に役立ちましたが、私が期待した方法ではありませんでした. これはバグではなくコンパイラの最適化だと思います。if ( z == true ) 内のコードをコメントアウトすると、条件文は完全にスキップされ、制御は if (x) に戻ります。実際のコードを入れると、必要に応じて条件文をヒットします。

元の質問: std::string があり、それを繰り返し処理して、特定の文字が含まれているかどうかを判断しています。これらの文字のいずれかが見つかった場合は、for ループを終了して、次の条件文に進みたいと考えています。次に例を示します。

#include <iostream>
using namespace std;

int main()
{
    bool x = true;
    bool y = true;
    bool z = true;

    std::string str;

    cout << "Enter string: ";
    cin >> str;

    if ( x )
    {
        if ( y )
        {
            std::string::iterator i;

            for ( i = str.begin(); i != str.end(); i++ )
            {
                cout << "Enter for" << endl;

                if ( *i == 'a' || *i == 'b' || *i == 'c' )
                {
                    z = false;
                    cout << "Exit for" << endl;
                    break;
                }
            }
            if ( z == true )
            {
                //cout << "z == true" << endl;
            }
        }
    }
}

問題は、プログラムが if (z == true) にヒットしないことです。ループから抜けると、制御は最初の条件ステートメント ( if (x) ) に戻ります。

ブレークを削除して、代わりに i = ( str.end() - 1 ) を設定しようとしました。これは同じ動作になりました - for に戻り、それが文字列の最後の文字にあると判断し、最初の条件ステートメントに制御を戻し、意図したように if ( z == true ) をスキップします。

ここで何が間違っていますか?

4

1 に答える 1