🇯🇵 日本語 | 🇺🇸 English
広告スペース

第16回 for文

C言語のfor文 ― 決まった回数の繰り返し。ループ回数ビジュアライザとステップ実行で動きを可視化。

📖 このページで覚えること
✅ 最低限ここだけ覚える
  • for (初期化; 条件; 更新) { ... } の3部構成
  • 繰り返し回数が決まっているときに使う
  • break で抜ける、continue で次へ
⭐ 余裕があれば読む
  • 無限ループ for (;;)
  • ネストループと計算量 (二重ループ)
  • sum += i パターンで累積計算

なぜループが必要? ― 同じことを繰り返す面倒くささ

もしループがなかったら、プログラムはどんなに面倒になるでしょうか?「1から5まで表示する」だけのプログラムを、ループなしで書いてみましょう。

❌ ループなしの場合

#include <stdio.h>

int main(void) {
    printf("1\n");
    printf("2\n");
    printf("3\n");
    printf("4\n");
    printf("5\n");
    return 0;
}
5回なら何とか書けますが… もし「1から100まで」だったら?
想像してみてください: 「1から100まで表示して」と言われて、printf("1\n"); printf("2\n"); ... printf("100\n");100行書きますか? もし途中で「3の倍数だけ表示して」に変更になったら、全部書き直しです。

✅ ループを使うと…

#include <stdio.h>

int main(void) {
    for (int i = 1; i <= 5; i++) {
        printf("%d\n", i);
    }
    return 0;
}
たった3行! しかも「100まで」に変えたければ 5100 に書き換えるだけ。10000回だって同じコード量で書けます。

ループの威力をスライダーで体感

表示したい回数を変えてみましょう。ループなしだと何行書く必要があるかが一目瞭然です。
❌ ループなし
5
printf を N 回書く必要あり
✅ ループあり
3 行
Nが何でも同じ行数

もっと困る例: 条件が変わったら?

「1から10までの合計」を求めるプログラムも、ループなしだと悲惨です。
// ループなしで「1+2+...+10」を計算
int sum = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10;

// ループあり
int sum = 0;
for (int i = 1; i <= 10; i++) sum += i;
ループの本質: 「同じパターンの処理を、少しずつ値を変えながら繰り返す」。ほぼ全てのプログラムに登場する、プログラミングで最も重要な概念の1つです。
さらに: ユーザーの入力に応じて回数が変わる処理(例: 1からN まで合計)は、ループなしでは書けません。Nが実行前に決まらないと、printf を何回書けばいいか分からないからです。

for文 ― 決まった回数の繰り返し

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

ループ回数ビジュアライザ

現在の i
実行回数
0

ステップ実行 ― for文

for_demo.c

変数の状態

変数名

標準出力

 

break・continue ― ループの制御

break
ループを即座に抜ける。残りの繰り返しはすべてスキップ。
for (int i=0; i<10; i++) {
    if (i == 5) break;
    printf("%d ", i);
}
// 出力: 0 1 2 3 4
continue
今の回の残りをスキップして次の繰り返しへ。ループ自体は続く。
for (int i=0; i<5; i++) {
    if (i == 2) continue;
    printf("%d ", i);
}
// 出力: 0 1 3 4(2だけスキップ)
注意: breakcontinue最も内側のループにだけ作用します。二重ループの内側で break しても、外側のループは止まりません。

🔍 continue をもう一段深く ― 挙動・誤解・読みやすさ

continue は「残りを飛ばして次の周へ」。ループは抜けない点が break との最大の違いです。実行順序を細かく追ってみましょう。
📋 continue の実行トレース
for (int i = 0; i < 5; i++) {
    if (i == 2) continue;    // ← i==2 のとき、この下をスキップ
    printf("%d ", i);     // continue の後はここから戻らない
}
1周目 i=0: 条件 i==2 → 偽 → printf → 0 出力 → i++ で i=1
2周目 i=1: 条件 i==2 → 偽 → printf → 1 出力 → i++ で i=2
3周目 i=2: 条件 i==2 → 真 → continue → printf はスキップ → i++ で i=3(ここ重要)
4周目 i=3: 条件 i==2 → 偽 → printf → 3 出力
5周目 i=4: 条件 i==2 → 偽 → printf → 4 出力 → i=5 で終了
💡 最重要ポイント: continue で飛んだ後も、for の「更新部 i++」は必ず実行される。だから i=2 でスキップされても、次の周は i=3 になって進む。
🔴 よくある誤解① 「continue は break と似てる?」
この2つは真逆の働きです。間違えると挙動が全く変わります。
breakcontinue
ループ全体抜ける(終了)続ける(次の周へ)
今の周の残りスキップスキップ
for の更新部 i++実行されない実行される
使いどころ「もう探す必要ない」「この要素だけスキップしたい」
🔴 よくある誤解② while 文での continue は無限ループになり得る
for 文ならカウンタ更新は文法で担保されていますが、while 文では自分で書く必要があります。continue で飛ばすとその更新も飛ばされることがあり、無限ループの罠になります。
int i = 0;
while (i < 5) {
    if (i == 2) continue;  // ❌ i++ に到達しない → i=2 で無限ループ
    printf("%d ", i);
    i++;
}
対策: continue する前に i を更新する:
if (i == 2) { i++; continue; }  // ✅ これなら安全
💡 continue vs if で囲む ― 読みやすさの比較
「特定の条件だけ処理をスキップ」は continue でも if 入れ子でも書けますが、状況によって読みやすさが違います。
✅ continue が読みやすい: 早期スキップ
for (int i=0; i<n; i++) {
    if (arr[i] < 0) continue;  // 負値は無視
    if (arr[i] == 0) continue; // 0も無視

    // ここから正の値だけの長い処理...
    process(arr[i]);
    total += arr[i] * 2;
}
不要な条件を先に弾くことで、メイン処理のインデントが浅くなる。
⚠️ 同じ処理を if で書くと…
for (int i=0; i<n; i++) {
    if (arr[i] > 0) {  // 条件を反転して囲む
        process(arr[i]);
        total += arr[i] * 2;
    }
}
条件が1つなら if でも短い。でもスキップ条件が複数になると if のネストが深くなる。
使い分けの目安:
• スキップ条件が1つだけ・短い処理→ if で囲む
• スキップ条件が複数・メイン処理が長い→ continue で早期return風に
この発想はif文の「ガード節」や関数の早期returnと同じ。

自分で書いてみよう ― 繰り返し

my_loop.c
出力
「実行」を押してください...
💡 こんなことも試してみよう
広告スペース

関連する講座

繰り返し・配列・文字列
第22回 配列
C言語の配列の宣言・初期化・アクセス方法。メモリ配置も図解。
繰り返し・配列・文字列
第17回 while文・do-while文
条件で回数が決まらないループ。while / do-while の違いと使い分けを解説。
条件分岐編
第15回 switch文
C言語のelse if文とswitch文の使い方。複数条件分岐を解説。
← 前の講座
第15回 switch文
次の講座 →
第17回 while文・do-while文

確認クイズ

この講座の理解度をチェックしましょう!

Q1. for (int i=0; i<5; i++) のループは何回実行される?

4回
5回
6回

i は 0,1,2,3,4 の5つの値を取るので、5回実行されます。

Q2. for (int i=10; i>0; i--) のループは何回実行される?

9回
10回
11回

i は 10,9,8,…,1 の10個の値を取るので10回。条件 i > 0 なので i=0 では実行されません。

Q3. for (;;) { ... } はどうなる?

1回も実行されない
無限ループ
コンパイルエラー

初期化・条件・更新が全て省略され、条件が省略された場合は常に真とみなされるため無限ループになります。breakreturn で抜ける必要があります。

Q4. 次のコードの出力は?

for (int i = 0; i < 5; i++) {
    if (i == 3) continue;
    printf("%d ", i);
}
0 1 2 3 4
0 1 2 4
0 1 2

continue は現在の回の残りをスキップして次の繰り返しへ。i=3 のときだけ printf がスキップされるので 0 1 2 4
break なら「ループ自体を抜ける」ので 0 1 2 になる — 混同注意。

この記事をシェア
X(Twitter)でシェア Facebookでシェア LINEで送る はてブ

この講座の理解を深めるおすすめ書籍

サイトで動きを理解し、書籍で演習量を補うと効果的です

📘
苦しんで覚えるC言語
MMGames 著
初心者向けの定番入門書。丁寧な解説で基礎を固められます。
Amazonで見る
📗
新・明解C言語 入門編
柴田望洋 著
図解が豊富で、演習問題も充実。大学の教科書としても採用多数。
Amazonで見る
📙
プログラミング言語C 第2版
B.W.カーニハン, D.M.リッチー 著
通称K&R。C言語の原典。基礎を終えた後のステップアップに最適。
Amazonで見る

※ 上記リンクはアフィリエイトリンクです。購入によりサイト運営を支援いただけます。