これは簡略化されたサンプルです。基本的に、文字列リストから文字列をチェックします。チェックにパスすると、その文字列(filterStringOut(i);
)が削除され、他のチェックを続行する必要がなくなります。したがってcontinue
、次の文字列に。
void ParsingTools::filterStrings(QStringList &sl)
{
/* Filter string list */
QString s;
for (int i=0; i<sl.length(); i++) {
s = sl.at(i);
// Improper length, remove
if (s.length() != m_Length) {
filterStringOut(i);
continue; // Once removed, can move on to the next string
}
// Lacks a substring, remove
for (int j=0; j<m_Include.length(); j++) {
if (!s.contains(m_Include.at(j))) {
filterStringOut(i);
/* break; and continue; */
}
}
// Contains a substring, remove
for (int j=0; j<m_Exclude.length(); j++) {
if (s.contains(m_Exclude.at(j))) {
filterStringOut(i);
/* break; and continue; */
}
}
}
}
ネストされたループの内側から外側のループを継続するにはどうすればよいですか?
私の推測ではgoto
、外側のループの端にラベルを使用して配置することです。タブーgoto
がどうあるべきかを考えると、それは私にこの質問をするように促しました。
c ++ IRCチャットではfor
、チェックがパスした場合にtrueを返すブール関数にループを配置することが提案されました。したがって
if ( containsExclude(s)) continue;
if (!containsInclude(s)) continue;
または、単純にローカルブール値を作成し、それをtrue break
に設定し、ブール値をチェックして、trueの場合は続行します。
これをパーサーで使用していることを考えると、この例では実際にパフォーマンスを優先する必要があります。これgoto
はまだ役立つ状況ですか、それともコードを再構成する必要がある場合ですか?
goto
。そのため、評判が悪いにもかかわらず、正規の受け入れられた慣習は、を介してそれらをエミュレートすることです。名前を恐れるな-概念を恐れる。