continue
ループの条件が満たされた場合、残りのブロックをバイパスし、ブロックの先頭から再開します。
次の質問は、「では、どうすればいいですか?」私が考える答えは2つあります。
例:
void foo ()
{
size_t i = 0;
do
{
/*...*/
if ( /*...*/ )
{
/*...*/
continue;
}
/*...*/
i++;
} while ( /* loop conditional */ );
}
解決策 #1:手動でインクリメントする
void foo ()
{
size_t i = 0;
do
{
/*...*/
if ( /*...*/ )
{
/*...*/
i++;
continue;
}
/*...*/
i++;
} while ( /* loop conditional */ );
}
解決策 #2:goto
*の一意に有効なアプリケーション
void foo ()
{
size_t i = 0;
do
{
/*...*/
if ( /*...*/ )
{
/*...*/
goto foo_next;
}
/*...*/
foo_next:
i++;
} while ( /* loop conditional */ );
}
goto
2 つの場所でのインクリメントは技術的には同じ命令であるため、この場合は有効です。このソリューションは、反復ごとの揮発性変数がより複雑な場合に特に関連します。たとえば、複数の変数を設定したり、方程式や関数を使用して値を変更したりします。
単一のインクリメントまたはデクリメント ステートメントの場合、解決策 #1 が有利であることが判明する可能性があります。ただし、そのような実装の後にコードが変更された場合は、ステートメントの両方のインスタンスを更新することを忘れないでください (特に長期間の後に変更が行われた場合、バグが発生する可能性があります** )。したがって、解決策 2 を強くお勧めします。
goto
*悪い習慣のあらゆる使用を検討する人もいます。自分で決めて、これを残すことをお勧めします:「c goto bad」のグーグル
**この必要性を思い出させるコメントで十分かもしれませんが、私のアドバイスに従った場合、反復ごとの揮発性変数は単一のステートメントに制限されます。そして私は引用します:
1 行にコメントする理由はありません
-Linus Torvalds (出典: http://yarchive.net/comp/linux/coding_style.html )