C言語の繰り返し処理を完全解説|for・while・do…whileの違いと使い分け

目次

1. はじめに

C言語における「繰り返し処理」とは?

C言語は、コンパクトかつ効率的なコードが書けることから、今なお多くの現場で使われているプログラミング言語です。その中でも「繰り返し処理」は、ほぼすべてのプログラムに登場するといっても過言ではありません。

繰り返し処理とは、特定の処理を何度も自動的に実行する仕組みのことです。例えば、1から10までの数を表示したり、ユーザーからの入力を条件に応じて何度も受け付けたりする場面で使用されます。

なぜ「繰り返し処理」が重要なのか?

もし繰り返し処理がなかった場合、同じコードを何行も手動で書かなければなりません。これは保守性が低く、バグの温床になりやすいだけでなく、プログラム全体が冗長になってしまいます。

そのためC言語では、以下の3つの基本的な「繰り返し処理」の構文が用意されています。

  • for文:回数が明確に決まっている繰り返しに使う
  • while文:条件を満たす限り処理を続けたいときに使う
  • do…while文:最低でも一回は処理を実行したいときに使う

これらのループ文を使い分けることで、プログラムをより柔軟かつ効率的に構築することができます。

この記事でわかること

本記事では、C言語における各繰り返し構文の使い方や違い、実践的なコード例、そしてよくあるミスや注意点まで詳しく解説していきます。C言語を学び始めたばかりの方でも理解しやすいよう、丁寧な説明を心がけていますので、安心して読み進めてください。

2. for文の基本と使い方

for文とは?

C言語におけるfor文は、繰り返し回数があらかじめ決まっている処理に最も適した構文です。例えば、「1から100までの数値を1つずつ表示する」や「10回だけ処理を繰り返す」といったケースでは、for文がシンプルで明快です。

for文の基本構文

for (初期化式; 条件式; 変化式) {
    // 繰り返し実行したい処理
}

それぞれのパートの意味は以下の通りです:

  • 初期化式:カウンタ変数を初期化(例:int i = 0;
  • 条件式:この条件がtrueの間、繰り返しが続く
  • 変化式:繰り返しごとにカウンタを増減(例:i++

具体的な例:1から10までの数値を表示する

#include <stdio.h>

int main() {
    for (int i = 1; i <= 10; i++) {
        printf("%d
", i);
    }
    return 0;
}

このコードでは、変数iが1から10まで1ずつ増加しながら、10回繰り返してprintfで表示しています。とても直感的で、視認性の高い繰り返し処理の一例です。

for文を使うメリット

  • 処理回数が明確であれば、コードが短くなる
  • 初期化、条件、更新を1行にまとめられるため読みやすい
  • 配列との相性がよく、要素を順に処理するのに適している

注意点:無限ループに注意

以下のように、条件式が常に真(true)であると、無限ループになります。

for (;;) {
    // 無限に繰り返される
}

これは意図的に無限ループを作りたいときに使われますが、通常は条件式の指定ミスによる意図しない無限ループに注意が必要です。

breakとcontinueの活用

for文の中でループを途中で終了したい場合はbreak、特定の条件をスキップしたい場合はcontinueを使います。

for (int i = 1; i <= 10; i++) {
    if (i == 5) continue; // 5はスキップ
    if (i == 8) break;    // 8になったらループ終了
    printf("%d
", i);
}

出力は「1〜4, 6, 7」となります。

年収訴求

3. while文の基本と使い方

while文とは?

while文は、ある条件が成立している間、処理を繰り返すための構文です。
for文と異なり、繰り返し回数が明確でない場合や、ユーザーの入力や外部データの状態に応じて処理を続ける場合などに適しています。

たとえば、「ユーザーが正しい値を入力するまで繰り返す」といった処理では、while文が直感的です。

while文の基本構文

while (条件式) {
    // 繰り返し実行したい処理
}
  • 条件式trueの間、ブロック内の処理を繰り返します。
  • 条件が初めからfalseであれば、一度も実行されないことに注意が必要です。

具体例:1から10までの数値を表示する

#include <stdio.h>

int main() {
    int i = 1;
    while (i <= 10) {
        printf("%d
", i);
        i++;
    }
    return 0;
}

このコードは、for文とほぼ同じ動作をwhile文で実現しています。
初期化(int i = 1;)と変化(i++)をループ外で書く必要がある点が異なります。

while文が活きる場面:ユーザー入力による制御

#include <stdio.h>

int main() {
    int input = 0;
    while (input != -1) {
        printf("数値を入力してください(終了するには-1):");
        scanf("%d", &input);
    }
    printf("終了します。
");
    return 0;
}

このように、ユーザーが特定の値を入力するまでループを続ける処理は、while文が直感的です。

注意点:無限ループになりやすい

while文で条件式の中に変化がないと、意図せず無限ループになることがあります。以下はNG例です。

int i = 1;
while (i <= 10) {
    printf("%d
", i);
    // i++ を忘れると無限ループに…
}

→ 繰り返しの中で変数の状態を変化させることを忘れないようにしましょう。

break・continueの活用

while文でも、for文と同様にbreakcontinueを使うことができます。

int num = 0;
while (num < 10) {
    num++;
    if (num == 5) continue; // 5はスキップ
    if (num == 8) break;    // 8で終了
    printf("%d
", num);
}

出力結果は「1〜4, 6, 7」となります。

4. do…while文の基本と使い方

do…while文とは?

do...while文は、C言語で使用できる3種類のループ構文の中で、唯一「必ず1回は処理を実行する」という特徴を持っています。

通常のwhile文では、最初の条件判定がfalseであれば一度も処理が実行されませんが、do...while文では処理ブロックが先に実行され、その後に条件をチェックします。

そのため、「一度だけでもユーザーの入力を受け付けたい」「最低1回はファイルを読み込む処理を実行したい」といった状況に適しています。

do…while文の基本構文

do {
    // 繰り返し実行したい処理
} while (条件式);

whileの後ろにセミコロン(;)が必要な点に注意してください。

具体例:1から10までの数値を表示する

#include <stdio.h>

int main() {
    int i = 1;
    do {
        printf("%d
", i);
        i++;
    } while (i <= 10);
    return 0;
}

このコードは、for文while文と同様に1〜10の数値を表示します。ただし、do...while文では処理が先に行われ、条件は後からチェックされます。

特徴的な使い方:ユーザー入力の再要求

#include <stdio.h>

int main() {
    int number;
    do {
        printf("10以上の数値を入力してください:");
        scanf("%d", &number);
    } while (number < 10);
    printf("ありがとうございます。入力された値:%d
", number);
    return 0;
}

この例では、ユーザーが10未満の数値を入力した場合に、再度入力を促します。
do...while文は、最低1回は処理を実行することが前提のような場面に最適です。

do…while文のメリットと注意点

メリット

  • 必ず1回処理が実行される
  • 入力待ちや初期処理に向いている

注意点

  • 処理が先に行われるため、条件式を正しく設定しないと意図せず2回以上処理されてしまう可能性がある
  • for文while文よりも使用頻度はやや低めだが、適切に使えば非常に便利

break・continueの使用

do...while文でも、breakcontinueは有効です。条件や回数によって、ループの制御を柔軟に行えます。

int i = 0;
do {
    i++;
    if (i == 3) continue; // 3はスキップ
    if (i > 5) break;     // 5まで表示
    printf("%d
", i);
} while (i < 10);

出力結果は「1, 2, 4, 5」となります。

5. for文とwhile文、do…while文の使い分け

それぞれのループ文の違いを理解しよう

C言語には3種類の繰り返し構文(for、while、do…while)が存在しますが、どれを使っても「繰り返し処理」は実現できます。
では、なぜ複数のループ構文が用意されているのでしょうか? それは、それぞれに適した場面や使いやすさがあるからです。

ここでは、3つのループ文をどう使い分けるかを、初心者にもわかりやすく解説します。

for文:繰り返し回数が決まっているときに使う

for文は、ループの開始・終了条件・変化処理が1行にまとまっているため、非常に見通しが良いのが特徴です。

for (int i = 0; i < 10; i++) {
    // 10回繰り返す処理
}

このように「〇回繰り返す」と決まっている場合には、まずfor文を検討しましょう。特に、配列の走査やカウンタ制御に強い構文です。

while文:条件が満たされる限り繰り返したいときに使う

while文は、繰り返し回数が明確でない場合に便利です。
例えば、ユーザーの入力やセンサーの値など、外部からの情報に依存する処理では、while文の柔軟さが活きます。

while (!終了条件) {
    // 条件がtrueの間、繰り返す処理
}

処理を繰り返すかどうかを毎回判定しながら進める必要がある場合は、while文を使うと自然です。

do…while文:最低1回は必ず実行したいときに使う

do...while文は、「1回は処理を実行してから判定したい」という場面に使います。

do {
    // 1回目は必ず実行
} while (条件);

例えば、「メニューを一度表示してから、再表示するかどうかをユーザーに尋ねる」といった状況に適しています。

使い分けの早見表

処理内容適したループ構文
回数が決まっている繰り返しfor文
条件がtrueの間ずっと続けたい場合while文
最低1回は必ず実行したい場合do…while文
配列やインデックス付き処理が必要for文(特におすすめ)
入力が終了条件になる処理while文またはdo…while文

実際にはどれを使ってもよい?

もちろん、同じ処理をfor文でもwhile文でも実装可能です。しかし、コードの可読性やメンテナンス性を高めるために「適切な構文」を選ぶことが重要です。

例えば、繰り返し回数が明確なのにwhile文で実装すると、条件やカウンタがループの外に散らばり、見通しが悪くなります。
逆に、ユーザー入力を何度も受け付けるような処理をfor文で書くと、処理の意図が伝わりにくくなってしまいます。

最適なループ選びが、読みやすくバグの少ないコードにつながる

ループ構文を「見た目」や「なんとなくの癖」で選ぶのではなく、処理の目的に応じて適切に選択することが、プログラムの品質向上につながります。

6. 繰り返し処理における注意点

ループ処理は便利だが、注意しないとバグの温床に

繰り返し処理は、プログラミングにおける基本中の基本であり非常に便利な構文です。しかし、その一方でループ処理の設計ミスや書き方の不備が原因で、思わぬ不具合やバグが発生しやすいポイントでもあります。

ここでは、C言語における繰り返し処理を安全かつ正しく扱うために、押さえておくべき注意点を解説します。

無限ループを防ぐには

最も多いトラブルの一つが「無限ループ」です。これは、ループの終了条件が永遠に満たされず、処理が止まらなくなる状態を指します。

たとえば、次のようなコードは注意が必要です。

int i = 0;
while (i < 10) {
    printf("%d
", i);
    // i++ を忘れるとループが永遠に続く
}

この場合、i++を入れ忘れることでiの値が変わらず、条件が常にtrueとなってしまいます。

対策:

  • 条件式だけでなく、「変化式」が正しく動作しているか常にチェックする
  • ループ中に条件が変化しているかを意識する

break文の適切な使い方

breakは、ループを強制的に抜けるための制御文です。便利ではありますが、多用するとコードの意図がわかりにくくなることもあります。

while (1) {
    int input;
    scanf("%d", &input);
    if (input == 0) break; // 0が入力されたらループ終了
}

このように、while (1)と無限ループを前提にし、特定の条件でbreakする書き方もよく使われます。可読性を保つには、適切なコメントを付けたり、関数に切り出す工夫が効果的です。

continue文の使いすぎに注意

continueは、現在のループの残りの処理をスキップして、次の繰り返しに進むための制御文です。
適切に使えば処理の流れを整理できますが、条件分岐が複雑なコードで多用すると、逆に理解しにくくなることがあります。

for (int i = 0; i < 10; i++) {
    if (i % 2 == 0) continue; // 偶数はスキップ
    printf("%d
", i);        // 奇数だけ表示
}

このような簡潔な用途では有効ですが、条件が増えたり、入れ子構造が深くなっている場合には要注意です。

多重ループ(ネストされたループ)での注意点

繰り返し処理の中にさらにループを入れる「多重ループ(ネスト)」も、便利でよく使われるパターンです。
ただし、ネストが深くなりすぎるとコードが複雑化し、以下のような問題を引き起こす可能性があります。

  • 処理の意図が読み取りにくい
  • パフォーマンスが低下する(特に三重ループ以上)
  • 変数の使いまわしによるバグ
for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++) {
        printf("i=%d, j=%d
", i, j);
    }
}

この程度のネストなら問題ありませんが、深くなる場合は関数に分ける処理の一部をコメントで補足するなど、読みやすさを意識しましょう。

条件式のミスや境界値のバグに注意

ループ条件に使う「<」や「<=」などの比較演算子のミスも、1回足りない・1回多いといったロジックバグを生みやすいポイントです。

// 0〜9 まで出力したい場合
for (int i = 0; i <= 9; i++)  // 正しい
// ↓ 間違えて < にすると、0〜8 までしか出力されない
for (int i = 0; i < 9; i++)   // バグの原因に

繰り返し処理は「境界値」に非常に敏感なため、目的の回数・範囲が正しく指定されているかを常に確認しましょう。

7. よくある質問(FAQ)

Q1. for文とwhile文の違いは何ですか?

A:
どちらも繰り返し処理を行う構文ですが、主に次の点で使い分けられます:

  • for文繰り返し回数が決まっている場合に使うのが基本です。カウンタ変数の初期化、条件、更新処理を1行で記述できるため、視認性に優れます。
  • while文条件が満たされている限り繰り返す場合に適しています。処理回数が不明な場合や、条件に基づいて繰り返す必要がある場合に有用です。

例:

// for文(10回繰り返す)
for (int i = 0; i < 10; i++) {
    // 処理
}

// while文(特定の条件を満たす間だけ繰り返す)
while (条件) {
    // 処理
}

Q2. do…while文はいつ使えばよいですか?

A:
do...while文は、最低でも1回は必ず処理を実行したい場合に使用します。
例えば、「最初に必ずメニューを表示して、その後ユーザーの選択に応じて処理を続ける」といったケースにぴったりです。

int option;
do {
    printf("1. 再表示  2. 終了:");
    scanf("%d", &option);
} while (option == 1);

このように、処理が1回目から無条件で実行されることが前提のロジックでは、do...while文が適切です。

Q3. 無限ループを防ぐにはどうすればいいですか?

A:
無限ループとは、ループの終了条件が永遠に満たされず、処理が止まらなくなる状態のことです。C言語では以下のような原因がよく見られます:

  • カウンタ変数を更新していない
  • 条件式が常に真(true)になるような設計ミス
  • ループの終了条件が正しく設定されていない

対策としては:

  • for文while文の中で、変数が変化しているかを確認する
  • 終了条件が正しく設定されているか見直す
  • デバッグ中は、一定回数で強制終了する安全機構(例:カウンタの上限)を組み込むのも有効

Q4. breakとcontinueの違いは?

A:
どちらもループ制御に使う文ですが、動作が異なります:

  • breakループそのものを終了させます。多くの場合、ある条件が満たされたらループを途中で抜けたいときに使います。
  • continueその回のループ処理をスキップし、次の繰り返しに進みます。

例:

for (int i = 1; i <= 5; i++) {
    if (i == 3) continue; // 3はスキップ
    if (i == 5) break;    // 5でループ終了
    printf("%d
", i);
}

出力結果は「1, 2, 4」となります。

Q5. どのループ構文を使えばよいか迷ったら?

A:
以下のように考えると選びやすくなります:

状況選ぶべき構文
回数が決まっているfor文
条件が満たされている限り続けたいwhile文
最低1回は必ず実行したい場合do…while文

また、可読性やチームのコーディングスタイルも考慮し、「一目で意図が伝わる構文」を選ぶのがベストです。

8. まとめ

本記事では、C言語における繰り返し処理の基本であるfor文while文do…while文の3種類のループ構文について、それぞれの使い方と使い分けのポイントを解説しました。

繰り返し処理は、プログラミングにおける最も基本的でありながら、非常に強力な仕組みです。処理の自動化、入力の反復、条件に応じたループなど、あらゆる場面で登場します。

各ループ構文の振り返り

  • for文:繰り返し回数が明確な場合に最適。カウンタ変数とループ条件を1行にまとめて書けるため、視認性に優れる。
  • while文:条件が成立している限り処理を続けたいときに使用。外部入力や状態変化に応じた柔軟な処理が可能。
  • do…while文:最低1回の処理が保証されているため、初回処理の実行が必要なケースに便利。

ループ処理を扱う際の注意点

  • 無限ループや条件式の書き間違いに注意
  • break/continueの使い方と効果を正しく理解する
  • ネストが深くなりすぎないようコードの構造を意識する
  • 処理の意図が読み取りやすい構文を選ぶ

最後に:学習のコツ

繰り返し処理は、実際に手を動かしてコードを書きながら習得するのが最も効果的です。
まずはシンプルなカウントアップや条件付きループから始めて、徐々にユーザー入力やネストされたループなど応用的な内容に挑戦してみましょう。

あなたのプログラミングスキルを支える柱の一つとなるのが、この「繰り返し処理」です。ぜひ、この記事を参考にしながら、自分の力でコードを書いて動かしてみてください。

侍エンジニア塾