フリーキーズ | 独学プログラミング

C言語の繰り返し構文入門!for文とwhile文の使い分けとコツを解説

最終更新日
リンドくん

リンドくん

たなべ先生、プログラミングで「繰り返し」って何ですか?
C言語ではどうやって書くんですか?

たなべ

たなべ

プログラミングの「繰り返し」は、同じ処理を何度も実行するための強力な機能なんだ。
例えば「10回挨拶する」とか「全員の点数を集計する」といった作業が簡単にできるよ。

C言語では主にfor文while文という2種類の繰り返し構文を使うんだ。

プログラミングで繰り返しが重要な理由

プログラミングにおいて繰り返し処理(ループ処理)は最も基本的で重要な概念の一つです。なぜでしょうか?
それは同じコードを何度も書かなくて済むからです。

例えば、「1から100までの数字を画面に表示する」というタスクを考えてみましょう。
繰り返し構文を使わない場合、以下のように書く必要があります。

printf("1\n");
printf("2\n");
printf("3\n");
...
printf("100\n");

これは非常に非効率的ですよね。
繰り返し構文を使えば、わずか3〜4行のコードで同じことが実現できます。

繰り返し処理の利点は他にもあります。

  • コードがシンプルになる = 同じ処理の繰り返しをコンパクトに表現できます
  • メンテナンス性が向上する = 修正が必要な場合も1箇所だけ変更すれば済みます
  • 柔軟性が増す = 繰り返し回数を変数で制御できるため、状況に応じて動作を変えられます

C言語では主に「for文」と「while文」の2種類の繰り返し構文があり、状況に応じて使い分けることが重要です。

for文の基本と使い方

リンドくん

リンドくん

for文ってなんとなく見たことあるんですけど、書き方が複雑そうで...

たなべ

たなべ

確かに最初は少し複雑に見えるかもしれないね。でも基本的には「何回繰り返すか」が明確なときに使うんだ。
仕組みを理解すれば、とても便利だよ!

for文の基本構造

for文の基本的な構文は以下の通りです。

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

各部分の役割を説明すると以下のようになります。

  • 初期化 = ループを開始する前に一度だけ実行される部分(カウンター変数の初期値設定など)
  • 条件式 = 各ループの開始時にチェックされ、真(0以外)であれば処理が実行される
  • 更新式 = 各ループの終了時に実行される部分(カウンターの増加など)

実際の例を見てみましょう。

#include <stdio.h>

int main() {
    // 1から10までの数字を表示するfor文
    for (int i = 1; i <= 10; i++) {
        printf("%d\n", i);
    }
    return 0;
}

このコードは以下のように説明できます。

  1. int i = 1 で変数iを1に初期化します
  2. i <= 10 という条件が真の間は処理が繰り返されます
  3. 各ループの終わりに i++ (iの値を1増やす)が実行されます
  4. 1から10までの数字が順に表示されます

for文の応用例

for文はさまざまな場面で活用できます。

例1)配列の全要素を処理する

int scores[5] = {78, 85, 90, 72, 88};
int sum = 0;

for (int i = 0; i < 5; i++) {
    sum += scores[i];  // 各要素を合計に加える
}

printf("合計点: %d\n", sum);
printf("平均点: %.1f\n", (float)sum / 5);

例2)カウントダウン

for (int i = 10; i > 0; i--) {
    printf("%d...\n", i);
}
printf("発射!\n");

for文は「繰り返し回数が明確」な場合に特に適しています。
例えば、配列に含まれるデータや特定回数の繰り返しなどがこれに当たります。

while文の基本と使い方

リンドくん

リンドくん

for文と比べて、while文はどんなときに使うんですか?

たなべ

たなべ

while文は条件が満たされる限り繰り返すという場面で活躍するんだ。
例えば、「ユーザーが正しい値を入力するまで」とか「ファイルの終わりに達するまで」といった、繰り返し回数が事前に分からないような状況で使うと効果的だよ。

while文の基本構造

while文の基本構文はfor文よりもシンプルです。

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

条件式が真(0以外)である限り、中の処理が繰り返し実行されます。

実際の例を見てみましょう。

#include <stdio.h>

int main() {
    int num = 1;
    
    while (num <= 10) {
        printf("%d\n", num);
        num++;  // numの値を1増やす
    }
    
    return 0;
}

このコードはfor文の例と同じく1から10までの数字を表示しますが、構造が異なります。

while文の応用例

while文の特徴を活かした例を見てみましょう。

例1)ユーザー入力の検証

#include <stdio.h>

int main() {
    int num;
    
    printf("1から10までの数字を入力してください: ");
    scanf("%d", &num);
    
    while (num < 1 || num > 10) {
        printf("範囲外です。1から10までの数字を入力してください: ");
        scanf("%d", &num);
    }
    
    printf("入力された数字は %d です。\n", num);
    return 0;
}

このコードは、ユーザーが1から10の範囲内の数字を入力するまで繰り返し入力を求めます。

例2)ファイル処理

FILE *fp = fopen("data.txt", "r");
char line[100];

while (fgets(line, sizeof(line), fp) != NULL) {
    printf("%s", line);  // ファイルから1行読み込んで表示
}

fclose(fp);

このように、while文は「条件が満たされる限り続ける」というシナリオに最適です。
入力検証、ファイル処理、または未知の回数の操作を必要とする状況で使用されます。

do-while文

リンドくん

リンドくん

for文とwhile文以外にも繰り返しの方法はあるんですか?

たなべ

たなべ

実はもう一つ、do-while文という繰り返し構文もあるんだ。これは少し特殊で、条件判定の前に必ず一度は処理を実行するんだよ。
ユーザー入力を求めるような場面でよく使われるよ。

do-while文の基本構造

do-while文の構文は以下の通りです。

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

while文と異なり、条件判定が処理の後に行われるため、最低1回は必ず処理が実行される点が特徴です。

do-while文の実用例

ユーザー入力を扱う場合に特に便利です。

#include <stdio.h>

int main() {
    int num;
    
    do {
        printf("1から10までの数字を入力してください: ");
        scanf("%d", &num);
    } while (num < 1 || num > 10);
    
    printf("入力された数字は %d です。\n", num);
    return 0;
}

この例では、条件判定の前に必ず一度はユーザーに入力を求めます。
while文の例と比較して、コードがよりシンプルになっています。

繰り返し構文の選び方と使い分け

リンドくん

リンドくん

for、while、do-whileのどれを使えばいいのか迷いそうです...

たなべ

たなべ

確かに迷うこともあるかもしれないね。
でも基本的なルールは、繰り返し回数が明確ならfor文条件が満たされる限り続けるならwhile文少なくとも1回は実行したいならdo-while文という感じだよ。

実際のシチュエーションで考えてみよう!

以下のような基準で使い分けると良いでしょう。

for文を使うべき場面

  • 繰り返しの回数が事前に分かっている場合
  • 配列やコレクションの全要素を処理する場合
  • 数値の範囲に対して処理を行う場合(例:1から100まで)

while文を使うべき場面

  • 繰り返しの終了条件はあるが、回数が事前に分からない場合
  • ファイルの終わりに達するまで処理を続ける場合
  • 特定の条件が満たされるまで続ける場合

do-while文を使うべき場面

  • 最低1回は必ず処理を実行したい場合
  • ユーザー入力を求め、その入力に基づいて続行するかを判断する場合
  • メニュー表示と選択のループなど

実際のプログラミングでは、これらのルールに基づいて適切な構文を選択することで、読みやすく効率的なコードを書くことができます。

繰り返し処理でよくあるミスと対策

リンドくん

リンドくん

繰り返し処理で初心者がよくやってしまうミスってありますか?

たなべ

たなべ

いいところに気づいたね!実は繰り返し処理には初心者がはまりやすい落とし穴がいくつかあるんだ。
特に注意したいのは「無限ループ」というもので、条件が永遠に満たされ続けてプログラムが終わらなくなってしまう状態だよ。そうならないための対策を見ていこう。

無限ループの防止

無限ループは、条件が永遠に真になってしまい、プログラムが終了しない状態です。
以下のようなミスで発生します。

// 無限ループの例
for (int i = 1; i >= 0; i++) {
    printf("%d\n", i);
}

この例では i >= 0 という条件が常に真になるため、iは増え続け、プログラムは終了しません。

対策

  • 条件式が必ず偽になる状況があるか確認する
  • 更新式が正しく変数を変化させているか確認する
  • 念のためループ内に強制終了条件(break文)を入れておく

境界条件(Off-by-one エラー)

配列のインデックスが範囲外になるなど、繰り返し回数が1回多かったり少なかったりするエラーもよく見られます。

// 間違った例(範囲外アクセス)
int arr[5] = {10, 20, 30, 40, 50};
for (int i = 0; i <= 5; i++) {  // <= が間違い
    printf("%d\n", arr[i]);  // i=5のとき範囲外アクセスになる
}

対策

  • 配列の場合は「サイズ未満(<)」を使うことを習慣づける
  • ループの初期値と終了条件を慎重に確認する
  • テストケースでエッジケースをチェックする

カウンター変数の操作ミス

ループ内でカウンター変数を意図せず変更してしまうミスも一般的です。

// 間違った例
for (int i = 0; i < 10; i++) {
    // 処理
    i++;  // ループ内でも増加させてしまっている
}

対策

  • ループカウンターはループ内で変更しない
  • 変更が必要な場合はwhile文を使う方が明示的で分かりやすい

これらの注意点を押さえておくことで、繰り返し処理に関する多くの問題を避けることができます。

まとめ

リンドくん

リンドくん

繰り返し処理って、プログラミングの基本中の基本なんですね!
いろんな使い方があることがわかりました。

たなべ

たなべ

その通り!
プログラミングにおける繰り返し処理は、単に同じコードを書かなくて済むだけでなく、より強力で柔軟なプログラムを作るための必須スキルなんだ。

今回の記事では、C言語の繰り返し構文について学びました。
ここでポイントを整理しておきましょう。

  • for文:繰り返し回数が明確な場合に最適(配列処理や決まった回数の繰り返し)
  • while文:条件が満たされる限り繰り返す場合に適している(終了条件はあるが回数不明の処理)
  • do-while文:最低1回は処理を実行し、その後条件判定を行う(ユーザー入力など)

繰り返し処理はプログラミングにおいて不可欠な要素であり、これらの基本構文をマスターすることで、あらゆる問題に対処するプログラムを書けるようになります。

繰り返し処理の原理を理解し、適切に使いこなせるようになると、より効率的で強力なプログラムを作れるようになります。
プログラミングの学習は繰り返しと反復によって上達しますので、ぜひ継続的に練習してみてください!

関連するコンテンツ