月ノ書

【C言語入門】for・while・do while をやさしく解説|繰り返し処理の考え方

今回の記事でわかること

この記事では、C言語における代表的な繰り返し文について学びます。

  • for 文・while 文・do while 文の基本的な使い方
  • 同じ処理を何度も繰り返す方法
  • それぞれの繰り返し文の使い分け

繰り返し処理とは?

プログラムでは「同じ処理を何度も行いたい」という場面がよくあります

たとえば、

こうした処理を実現するために使われるのが繰り返し文(ループ)です

繰り返し文の選び方

繰り返し文にはいくつか種類があり、目的によって使い分けます。

種類特徴向いている場面
for 文回数が決まっている決まった回数だけ繰り返したい
while 文条件が真の間繰り返す回数が事前に分からない
do while 文最低1回は必ず実行メニュー処理など

for 文

回数が決まっている繰り返し処理に最もよく使われます
構文は「初期化・条件・更新」の3つを1行で書くのが特徴です

#include <stdio.h>

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

出力結果

i = 1
i = 2
i = 3
i = 4
i = 5

この例では、

という流れで処理が行われています

for 文は条件を工夫することで、

など、さまざまな使い方ができます

ネスト
#include <stdio.h>

int main(void) {
    for (int x = 1; x <= 3; x++) {
        for (int y = 1; y <= 3; y++) {
            printf("%d×%d=%d  ", x, y, x * y);
        }
        printf("\n");
    }
    return 0;
}

/* 出力結果
1×1=1  1×2=2  1×3=3
2×1=2  2×2=4  2×3=6
3×1=3  3×2=6  3×3=9
*/

ループや条件分岐をさらに別のループ・条件分岐で囲むイメージ
二次元データを扱うときに使用されます(表や座標の作成など)

while 文

条件が真の間だけ繰り返すループです。回数が事前に分からない処理に向いています

#include <stdio.h>

int main(void) {
    int i = 1;
    while (i <= 5) {
        printf("i = %d\n", i);
        i++;    // 更新を忘れると無限ループになるので注意
    }
    return 0;
}

出力結果

i = 1
i = 2
i = 3
i = 4
i = 5

よく使われるのは、

といった入力チェック系の処理です

また、while (1) と書くと無限ループになります
この場合は break を使って明示的に抜けるのが一般的です

do while 文

必ず1回は処理を実行してから条件判定を行います
メニューUIのような処理に向いています

#include <stdio.h>

int main(void) {
    int choice;

    printf("\n=== メニュー ===\n");
    printf("1: 足し算  2: 引き算  0: 終了\n> ");

    do {
        if (scanf("%d", &choice) != 1) return 0;

        switch (choice) {
            case 1: printf("足し算を選びました\n"); break;
            case 2: printf("引き算を選びました\n"); break;
            case 0: printf("終了します\n"); break;
            default: printf("無効な選択です\n");
        }
    } while (choice != 0);

    return 0;
}

この例では、0が入力されるまで処理を繰り返す構造になっています

break / continue

命令動作
break今のループを終了
continue残りの処理を飛ばして次の周回へ
#include <stdio.h>

int main(void) {
    for (int i = 1; i <= 10; i++) {
        if (i % 3 == 0) continue; // 3の倍数はスキップ
        if (i == 8) break;        // 8でループ終了
        printf("%d ", i);
    }
    printf("\n");
    return 0;
}

出力結果

1 2 4 5 7

break一番内側のループだけに効く点には注意が必要です

実用的なループパターン

合計・最大値を求める

int a[] = {4, 9, 1, 7};
int len = sizeof(a) / sizeof(a[0]);
int sum = 0, max = a[0];

for (int i = 0; i < len; i++) {
    sum += a[i];
    if (a[i] > max) max = a[i];
}

逆順に走査する(後ろからチェック)

for (int i = len - 1; i >= 0; i--) {
    // a[i] を処理
}

2つのポインタ / カウンタで内側に詰める

for (int i = 0, j = len - 1; i < j; i++, j--) {
    // a[i] と a[j] を交換する、など
}

センチネル(特定値が来るまで)

int x;
while (scanf("%d", &x) == 1 && x != -1) {
    // -1 が来るまで処理
}

パフォーマンスと可読性のコツ

不変な計算はループの外へ

int len = sizeof(arr) / sizeof(arr[0]);

for (int i = 0; i < len; i++) {
    arr[i] = i * 2;
}

毎回同じ計算をループ内で行うのは無駄になりがちです

continue を使ってネストを浅くする

ネストが深くなると読みにくくなり、可読性が低下してしまいます。そんなときは「条件を満たさなかったらすぐ飛ばす(continue)」するとすっきりします

for (int i = 0; i < 100; i++) {
    if (i % 2 != 0) continue;
    if (i <= 10) continue;
    printf("%d\n", i);
}

「条件を満たしたときに何をするか」が見えやすくなります

マジックナンバーに名前を付ける

#define MAX_USERS 100
const int MAX_SCORE = 60;

数字の意味が明確になり、後から修正もしやすくなります

1行でも中かっこを付ける

if (x > 0) {
    printf("positive\n");
}
printf("always\n");

事故防止のためにも {} を付ける習慣がおすすめです

まとめ

今回は、C言語で使われる代表的な繰り返し文について解説しました

繰り返し処理は、プログラムを書くうえで避けて通れない重要な考え方です
同じ処理を何度も書かずに済み、コードを短く分かりやすく保つことができます

記事の内容を振り返ると、

学習進捗

0
Would love your thoughts, please comment.x