C言語基礎|4章のまとめ

はじめに:第4章は「繰り返し」と「書き方の基礎」を一気に身につける章だよ

第4章、おつかれさま!ここまで来たら、C言語の「プログラムらしさ」が一気に増してきたはずです。
第4章では、**繰り返し(do / while / for)を中心に、break / continue、増減演算子、複合代入、文字出力(putchar)、そして読みやすい書式(インデントや自由形式)**まで、実戦で頻出の道具がまとめて登場しました。

この「4章のまとめ」では、要点を整理しながら、それぞれが何をするものかどう使い分けるかを、表と図で分かりやすくまとめますね。

第4章で学んだこと全体像

まずは章全体の主役たちを、ひと目で一覧にします。

第4章の主要トピック早見表

分野学んだ項目ひとことで言うと
繰り返しdo / while / for同じ処理を何度も実行する仕組み。
ループ制御break / continue途中で抜ける・残りを飛ばす。
カウンタ操作++ / --(前置・後置)変数を1増やす・1減らす。
記述の簡潔化複合代入(+= など)演算+代入を1つで書く。
入力の妥当性範囲チェックなど変な値を受け付けない。
文字の出力putchar文字を1つだけ出す。
書式と要素キーワード・識別子・区切り子・自由形式コードを正しく読みやすく書く。

この表の見方
「分野」は学習テーマの分類、「学んだ項目」は登場した文法や機能、「ひとことで言うと」は実務的な役割です。章の復習に便利です。

繰り返し文の基本:真(非0)ならループが回る

繰り返し文は総称で「繰返し文(iteration statement)」です。
どの繰り返し文も共通して、制御式(条件式)を評価した結果が真(0以外)ならループ本体を実行します。

繰り返し文の共通イメージ

制御式を評価する
  ├─ 真(非0) → ループ本体を実行 → 次の判定へ
  └─ 偽(0)   → ループを終了して次へ進む

この図の説明
「真なら繰り返す、偽なら終わる」という共通ルールを図にしたものです。
違いは「判定がいつ行われるか」と「頭部に何をまとめられるか」です。

do / while / for の違い(前判定・後判定)

3つの繰り返し文の比較

判定タイミングループ本体が0回の可能性向いている場面
do後判定(最後に判定)ない(必ず1回)入力を最低1回は取りたい。
while前判定(最初に判定)ある条件が成立する間だけ回したい。
for前判定(最初に判定)ある回数やカウンタが明確な繰り返し。

この表の説明
「判定タイミング」と「0回の可能性」は使い分けに直結します。
特に、入力のやり直しは do が自然、回数が決まるなら for が読みやすい、という使い分けが基本です。

各命令の書式(構文)と何をするものか

do 文の書式と役割

do
    文;
while (式);
  • 式が真の間、文を繰り返す
  • 必ず1回は文が実行される(後判定)

while 文の書式と役割

while (式)
    文;
  • 式が真の間、文を繰り返す
  • 最初の判定で偽なら1回も実行されない(前判定)

for 文の書式と役割

for (式A; 式B; 式C)
    文;
  • 式A:最初に1回だけ実行(初期化など)
  • 式B:真の間ループ継続(継続条件)
  • 式C:毎回最後に実行(増分など)

break と continue:ループを「途中で制御」する

表:break と continue の違い

何をする?例えるなら
breakその繰り返し文を強制終了その場でループを脱出
continueその回の残り処理を飛ばす次の周回へスキップ

この表の説明
break は「ループそのものを終わらせる」、continue は「残りをやらずに次へ行く」。
似てるけど目的が違うので、混ざらないようにこの表で整理しておくと安心です。

++ / --(前置・後置):増やすタイミングが違う

増分演算子 ++、減分演算子 -- は、変数を1増やす/1減らす演算子です。
そして大事なのが 前置と後置で“式としての値”が違うこと。

前置と後置の違い

書き方変数の更新式として得られる値
++a先に増やす増やした後の値
a++後で増やす増やす前の値
--a先に減らす減らした後の値
a--後で減らす減らす前の値

この表の説明
「変数がどうなるか」だけじゃなく、「式としての値が何になるか」が違うのがポイントです。
printf の引数や条件式に混ぜたときに差が出ます。

複合代入演算子:短く書けて、左辺の評価が1回だけ

複合代入は「演算+代入」を一発で書く演算子です。

複合代入の基本形

意味(ほぼ同じ)
a += ba = a + b
a -= ba = a - b
a *= ba = a * b
a /= ba = a / b
a %= ba = a % b

重要な性質
複合代入は 左オペランドの評価が1回だけです。
複雑な式(配列、構造体、関数戻り値など)になるほどメリットが大きいです。

式文と空文:; は「何もしない文」になれる

式の後ろにセミコロンを付けると式文になります。

  • 例:x = 3; は式文
  • そして、式が省略されて ; だけのものが空文

表:式文と空文

種類何をする?
式文x = x + 1;式を評価して実行
空文;何もしない

空文は for や while の直後にうっかり置くと事故ります(ループ本体が空になる)。

putchar:単一文字を出力する

putchar は「文字を1つ」表示する関数です。

書式と役割

putchar(文字);
  • 例:putchar('*'); で * を1つ表示
  • 例:putchar('\n'); で改行

文字定数は 'A' のように単一引用符で囲みます。
"ABC" は文字列なので別物です。

ド・モルガンの法則:条件式を読みやすく変形できる

「否定して、and と or を入れ替える」やつです。

ド・モルガンの対応

変形前変形後(同じ意味)
x && y!( !x || !y )
x || y!( !x && !y )

例:0〜100の範囲外

  • x < 0 || x > 100
  • !(x >= 0 && x <= 100)
    どちらも同じ意味です。

Cの自由形式とインデント:動作より「読みやすさ」を守ろう

Cは自由形式なので改行や空白の位置は基本自由です。
でも、自由だからこそ 読みやすいインデントが大切になります。

  • 単語の途中に空白や改行を入れない。
  • #include の途中で改行しない。
  • 文字列リテラルの途中で改行しない。
  • まとまりは { } とインデントで表す。

章のまとめプログラム

例:入力の範囲チェック → カウント表示 → 約数列挙 → 図形表示

プロジェクト名:chap4-21-1 ソースファイル名:chap4-21-1.c

Visual Studio でこのプログラムを実行するには、SDLチェック設定を変更しておく必要があります。
1.プロジェクト名を右クリックして、「プロパティ」をクリックします。
2.「C/C++」→「全般」→「SDLチェック」を「いいえ」に切り替えて「OK」をクリックします。

#include <stdio.h>

int main(void)
{
    int x;

    /* do:入力を最低1回は受け取り、範囲外ならやり直し */
    do {
        printf("1〜30の整数を入力してください:");
        scanf("%d", &x);
        if (x < 1 || x > 30)
            puts("範囲外です。もう一度お願いします。");
    } while (x < 1 || x > 30);

    puts("カウントダウンとカウントアップを表示します。");

    /* while:前判定の繰り返し、後置と前置の違いを混ぜて確認 */
    int down = x;
    int up = x;

    while (down >= 0) {
        printf("%2d -> %2d\n", down--, ++up);
    }

    /* for + break + continue:約数を列挙(簡単で分かりやすい題材) */
    printf("%d の約数を表示します:\n", x);

    int count = 0;
    for (int i = 1; i <= x; i++) {
        if (x % i != 0) continue;   /* 割り切れないものはスキップ */
        printf("%d\n", i);
        count++;
        if (count >= 10) break;     /* 念のため多すぎる場合は中断(例として) */
    }
    printf("表示した約数は %d 個です。\n", count);

    /* 多重ループ:x を幅、高さ 3 の簡単な図形を描く */
    puts("横に並ぶ記号を表示します。");
    for (int r = 1; r <= 3; r++) {
        for (int c = 1; c <= x; c++)
            putchar('#');
        putchar('\n');
    }

    puts("おつかれさまでした。");
    return 0;
}

このプログラムで確認できること(対応表)

章の要素どこで使ってる?何の確認?
do範囲チェックの入力後判定で必ず1回実行
whileカウント表示前判定・++/--の違い
for約数列挙カウンタ制御が簡潔
continue約数列挙条件に合わない回を飛ばす
break約数列挙途中で中断する例
putchar図形表示文字を1つずつ出力
多重ループ図形表示行×列の繰り返し