C言語の「forループ」を徹底解説!わかりやすく解説し、サンプルコードも豊富に紹介

2024-07-03

C言語におけるforループの解説

構文

for (初期化式; 条件式; 更新式) {
  処理内容;
}

各要素の説明

  • 初期化式: ループ開始前に一度だけ実行される式です。一般的に、ループ内で使用する変数の初期化に使用されます。
  • 条件式: ループの継続条件を指定します。条件が真である限りループが繰り返され、偽になるとループが終了します。
  • 更新式: ループの毎回目に実行される式です。一般的に、ループ内で使用する変数の更新に使用されます。
  • 処理内容: ループ内で繰り返し実行される処理を記述します。中括弧 {} で囲まれます。

具体的な例

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

この例では、i という変数を 0 から 9 までループさせ、その値をコンソールに出力します。

forループの注意点

  • 初期化式、条件式、更新式は省略できますが、一般的には省略しない方がわかりやすいコードになります。
  • 条件式が常に真になる場合、ループが無限に繰り返されます。意図しない無限ループには注意が必要です。
  • ループ内で使用する変数は、ループの外側からも参照できます。

応用例

  • 配列の要素をすべて処理する
  • ファイルの行を1行ずつ読み込む
  • 特定の条件を満たすまで処理を繰り返す


    1から10までの整数を順番に表示

    #include <stdio.h>
    
    int main() {
      for (int i = 1; i <= 10; i++) {
        printf("%d ", i);
      }
      printf("\n");
      return 0;
    }
    

    配列の要素をすべて表示

    #include <stdio.h>
    
    int main() {
      int numbers[] = {10, 20, 30, 40, 50};
      int length = sizeof(numbers) / sizeof(int);
    
      for (int i = 0; i < length; i++) {
        printf("%d ", numbers[i]);
      }
      printf("\n");
      return 0;
    }
    

    偶数のみを表示

    #include <stdio.h>
    
    int main() {
      for (int i = 1; i <= 20; i++) {
        if (i % 2 == 0) {
          printf("%d ", i);
        }
      }
      printf("\n");
      return 0;
    }
    

    特定の文字を含む行を出力

    #include <stdio.h>
    #include <string.h>
    
    #define TARGET_CHAR 'a'
    
    int main() {
      char lines[3][100] = {
        "This is the first line.",
        "This is the second line.",
        "This is the third line."
      };
    
      for (int i = 0; i < 3; i++) {
        if (strchr(lines[i], TARGET_CHAR) != NULL) {
          printf("%s\n", lines[i]);
        }
      }
      return 0;
    }
    

    素数を表示

    #include <stdio.h>
    
    int is_prime(int num) {
      if (num <= 1) {
        return 0;
      }
    
      for (int i = 2; i <= num / 2; i++) {
        if (num % i == 0) {
          return 0;
        }
      }
    
      return 1;
    }
    
    int main() {
      for (int i = 2; i <= 100; i++) {
        if (is_prime(i)) {
          printf("%d ", i);
        }
      }
      printf("\n");
      return 0;
    }
    

    これらのコード例は、forループのさまざまな使い方を示しています。

    演習問題

    上記以外にも、以下の演習問題に挑戦してみてください。

    • 1から100までの数の累計を表示する
    • フィボナッチ数列の最初の20個の数を表示する
    • 文字列内のすべての英字を大文字に変換する
    • 二つの配列の要素をそれぞれ対応させて表示する


    C言語における「forループ」の代替方法

    代表的な代替方法

    • whileループ
    • do-whileループ
    • for-eachループ
    • 再帰

    それぞれの説明と、forループとの比較

    whileループ

    • 説明: 指定した条件が真の間、ループ処理を繰り返す方法です。
    • forループとの比較:
      • 利点: ループの終了条件を柔軟に設定できる
      • 欠点: 初期化式や更新式を記述する必要がある
    • 例:
    int i = 0;
    while (i < 10) {
      printf("%d ", i);
      i++;
    }
    
    • 説明: ループ処理を少なくとも1回実行してから、条件式を評価し、真の場合はループを繰り返す方法です。
    • forループとの比較:
      • 利点: 確実に1回ループ処理を実行できる
      • 欠点: 条件式が常に真の場合、無限ループになる可能性がある
    • 例:
    int i = 0;
    do {
      printf("%d ", i);
      i++;
    } while (i < 10);
    

    for-eachループ

    • 説明: 配列やリストなどのコレクションに対して、各要素に対して処理を行う方法です。
    • forループとの比較:
      • 利点: コードが簡潔でわかりやすい
      • 欠点: コレクションの要素しか処理できない
    • 例:
    int numbers[] = {10, 20, 30, 40, 50};
    for (int num : numbers) {
      printf("%d ", num);
    }
    

    再帰

    • 説明: 関数自身を呼び出すことで、繰り返し処理を行う方法です。
    • forループとの比較:
      • 利点: コードが簡潔でわかりやすい場合がある
      • 欠点: 複雑になりやすく、デバッグが難しい場合がある
    • 例:
    int factorial(int n) {
      if (n == 0) {
        return 1;
      } else {
        return n * factorial(n - 1);
      }
    }
    
    int main() {
      printf("%d\n", factorial(5));
      return 0;
    }
    

    上記以外にも、特定の状況で便利なループ処理の方法があります。

    • ブレイク文とコンテニュー文: ループの途中から抜け出す、または次のループ処理にスキップする方法
    • goto文: 特定のラベルにジャンプする方法