1000 行をループする非常に大きなループがあります。マジック値 1 が見つかった場合、ループを終了します。マジック値 1 が見つからず、マジック値 2 が見つかった場合、ループは先頭にスキップする必要があります。現在、スイッチ、いくつかのif、gotoを使用しています。goto は最善の方法ではないことを読みました。これを機能させるより良い方法はありますか?
7 に答える
ループを終了するには、breakステートメントを使用できます。次のレコードに進むには、continueステートメントを使用できます。
for(int i = 0; i < 1000; i++)
{
if(magicValue1)
break;
if(magicValue2)
continue;
}
私はGOTOステートメントの使用を容認していません私は可能性のある使用例を簡単に指摘しています
gotoジャンプステートメントを使用してループを開始/終了できますが、ネストされたループを使用していない限り、このオプションは使用しないでください。gotoステートメントは、最適化、完全に終了するための用途がまだあると思います。しかし、一般的には、かなり控えめに使用するのが最善です。
for(int i = 0; i < 100; i++)
{
start:
for(int i = 0; i < 10; i++)
{
if(magicValue1)
goto end;
if(magicValue2)
goto start;
}
}
end :
これはどう:
for(int i = 0; i < 1000; i++) {
if(values[i] == MAGIC_VALUE_1) {
break;
} else if(values[i] == MAGIC_VALUE_2) {
i = 0;
}
}
「最初にスキップする」とは、「このレコードをスキップして次のレコードを処理する」という意味の場合は、に置き換えi = 0
ますcontinue
。
なしのwhile
バリエーションbreak
:
bool continue = true; int i = 0;
while (i < 1000 && continue){
if(values[i] == MAGIC_VALUE_1) {
continue=false;
} else if(values[i] == MAGIC_VALUE_2) {
i = 0;
}
i++;
}
まだコメントできません (1 担当者ポイント離れています)
しかし、これは良くないでしょうか:
for (int i = 0; i < 1000; i++)
{
if (magicValue1)
{
break;
}
else if (magicValue2)
{
dosomething();
i=0;
}
}
「検索を再開する」の意味がわかりません。
私は#2の場合を、#2の場合のループ本体を実行したくない(つまりスキップしたい)ことを意味し、ループを0にリセットしたくないことを意味します(私がそれを持っている場合はコードコメントを参照してください)後方。)
この提案は、forループのあまり一般的でない条件が自己文書化スケールでは低いと言えるため、物議を醸す可能性がありますが、それが気にならない場合は、私が望むものを簡潔に書く方法は次のとおりです。
for (int i= 0; i<values.Length && values[i]!= MAGIC_1; i++)
{
if (values[i] == MAGIC_2)
{
// Don't do the loop body for this case but continue on looping
continue;
// If you want to reset the loop to zero instead of skip the 2 case,
// comment-out the continue; and un-comment the line below:
// i=0;
}
// Do long loop body here
}