whileループ
概要
変数の中身次第でコードを何回も実行する。
同じような処理を何度も繰り返したい場合に。
主に何回繰り返すことになるかわからない場合に使う。
基本的な書き方
while (条件式) {
繰り返し実行したいコード
}
whileループの動作
if文は条件を満たしてコードを実行した後は下に進む。
例えば、以下の場合。
int n = 1;
if (n<10) {
n *= 2;
}
n が 1 から 2 になった後、そのまま下へ進む。
whileループは条件を満たしてコードを実行した後は判定に戻る。
例えば、以下の場合。
int n = 1;
while (n<10) {
n *= 2;
}
n が 1 から 2 になった後、もう一度 n<10 かどうかを判定する。
2 は 10 より小さいので、もう一度実行されて n が 4 となり、また n<10 かどうかを判定する。
4 は 10 より小さいので、もう一度実行されて n が 8 となり、また n<10 かどうかを判定する。
8 は 10 より小さいので、もう一度実行されて n が 16 となり、また n<10 かどうかを判定する。
16 は 10 より小さくないので、ループを終了し、下へ進む。
条件式
詳しくは「if分岐」の記事参照。
よく使う処理
中断処理 break;
ループを無理矢理終了させる。
while (i>0) {
// 何かのコード
if (j==0) break; // ここから
// 何かのコード // ↓
} // ↓
// 何かのコード // ここに飛ぶ
if文の中に書いた場合でも、ちゃんとループを抜ける。
二重ループの中に書いた場合は、内側のループのみ抜ける。
二重ループを両方一気に抜けたい場合は、何かフラグを用意して利用する。
内側のループを抜けた直後に「フラグが立っていたら break;」を書く。
while (i>0) {
bool flag = false; // ←これを用意しておいて
while (j>0) {
// 何かの処理
if (k==0) {
flag = true; // ←全部脱出するフラグを立てる
break; // ←これで内側を脱出
}
}
if (flag) break; // ←これで外側も脱出
}
継続処理 continue;
ループを無理矢理次に行く。
while (i<0) { // ここに飛ぶ
// 何かのコード // ↑
if (j==0) continue; // ここから
// 何かのコード
}
// 何かのコード
break; とは異なり、その回だけを終了してもう $1$ 回条件の判定からやり直す。
注意点
if文の注意点が全てそのまま当てはまる。
詳しくは「if分岐」の記事参照。
無限ループを起こさないように注意
判定条件が満たされ続ける限り、$100$ 回でも $10000$ 回でも $5000$ 兆回でも繰り返される。
A問題やB問題で実行に長時間かかっている場合、これをやらかした可能性が高い。
判定に使われている何かが毎回変わるか、どこかで break; するかで終了を保証できるコードを書くこと。
関連知識
bool型
whileループの条件式は、最終的に true か false として判定される。
!、&&、|| など bool 型の論理演算も扱う必要がある場合がある。
if分岐
whileループと似ているが、条件に合えば $1$ 回だけ実行し、そのまま次へ進む。
forループ
最もよくあるwhileループの使い方を、より書きやすくしたもの。
ループ回数がはっきりしている場合はforループの方が書きやすい。