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文
特定のラベルにジャンプする方法 - ブレイク文とコンテニュー文
ループの途中から抜け出す、または次のループ処理にスキップする方法