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ループの方が書きやすい。