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ループのさまざまな使い方を示しています。

演習問題

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

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


代表的な代替方法

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

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

whileループ


  • forループとの比較
    • 利点
      ループの終了条件を柔軟に設定できる
    • 欠点
      初期化式や更新式を記述する必要がある
  • 説明
    指定した条件が真の間、ループ処理を繰り返す方法です。
int i = 0;
while (i < 10) {
  printf("%d ", i);
  i++;
}

do-whileループ


  • forループとの比較
    • 利点
      確実に1回ループ処理を実行できる
    • 欠点
      条件式が常に真の場合、無限ループになる可能性がある
  • 説明
    ループ処理を少なくとも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文
    特定のラベルにジャンプする方法
  • ブレイク文とコンテニュー文
    ループの途中から抜け出す、または次のループ処理にスキップする方法