更新: 助けてくれてありがとう。あなたが実行できるデモを書くことは、問題の解決に役立ちましたが、私が期待した方法ではありませんでした. これはバグではなくコンパイラの最適化だと思います。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 ) をスキップします。
ここで何が間違っていますか?