【C言語入門】for・while・do while をやさしく解説|繰り返し処理の考え方
今回の記事でわかること
この記事では、C言語における代表的な繰り返し文について学びます。
- for 文・while 文・do while 文の基本的な使い方
- 同じ処理を何度も繰り返す方法
- それぞれの繰り返し文の使い分け
繰り返し処理とは?
プログラムでは「同じ処理を何度も行いたい」という場面がよくあります
たとえば、
- 1〜10までの数字を順番に表示したい
- ユーザーが正しく入力するまで、何度も入力を求めたい
- 配列やリストの中身をすべて処理したい
こうした処理を実現するために使われるのが繰り返し文(ループ)です
繰り返し文の選び方
繰り返し文にはいくつか種類があり、目的によって使い分けます。
| 種類 | 特徴 | 向いている場面 |
|---|---|---|
| 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この例では、
i = 1からスタートi <= 5の間繰り返し- 1回ごとに
i++で値を更新
という流れで処理が行われています
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言語で使われる代表的な繰り返し文について解説しました
繰り返し処理は、プログラムを書くうえで避けて通れない重要な考え方です
同じ処理を何度も書かずに済み、コードを短く分かりやすく保つことができます
記事の内容を振り返ると、
- for 文は回数が決まっている処理に向いている
- while 文は条件が満たされている間だけ繰り返したいときに便利
- do while 文は最低1回は必ず処理を実行したい場面で使う
- break / continueを使うことで、ループの流れを柔軟に制御できる