C言語学習ポータル(無料版) 学習コンテンツ 制御構造 流れを変える——制御構造の全体像

🔀 制御構造

流れを変える——制御構造の全体像

無料公開版に収録・読む目安 8分

🎯 プログラムの流れが「順次・分岐・繰り返し」の3つでできていることを理解し、場面に応じてどれを使うか見当をつけられる

プログラムは、書いた順に上から下へ実行されます。カレーのレシピと同じです。

ところが、実際のレシピにはこんな行がありませんか。「まだ固ければ、もう5分煮る」「アクが出なくなるまで、すくい続ける」。この2つは、上から順に読むだけでは表せません。プログラムにも、流れを曲げたり、同じ場所をぐるぐる回ったりする仕組みが要ります。それが制御構造です。

制御構造は、たった3つしかありません。

順次 — 上から順に実行する。何も指示しなければ、いつもこれです。

分岐 — 条件によって通る道を選ぶ。if文とswitch文が担当します。

繰り返し — 条件が満たされている間、同じ処理を回す。for文とwhile文が担当します。

どんなに複雑なアプリでも、突き詰めればこの3つの組み合わせです。コンピュータはメモリに並んだ命令を上から順に実行していきますが、分岐は「次に実行する場所を飛ばす」こと、繰り返しは「前の場所へ戻る」こと。つまり制御構造とは、実行する場所をどこへ移すかの指示にすぎません。読むのが苦しくなったら「今どの行にいるか」を指で追ってください。プログラムを読むとは、その指の動きを追うことです。

まずは順次だけのプログラムです。

#include <stdio.h>

int main(void) {
    int price = 500;
    int count = 3;
    printf("合計 %d 円\n", price * count);
    return 0;
}

上から1行ずつ、寄り道せずに進みます。ここに分岐を足すと、道が2本に分かれます。

#include <stdio.h>

int main(void) {
    int total = 1200;

    if (total >= 1000) {          // ここで道が分かれる
        printf("送料無料です\n");
    } else {
        printf("送料 300 円です\n");
    }
    return 0;
}

繰り返しを足すと、同じ場所を何度も通れます。

#include <stdio.h>

int main(void) {
    for (int i = 1; i <= 3; i++) {   // 3回まわる
        printf("%d 回目\n", i);
    }
    return 0;
}
ビット3つだけ、って聞くと急に簡単そうに見えるよね。あとはこの3つをどう組み合わせるか、の勝負だよ

ここで先に釘を刺しておきます。流れの範囲を決めているのは、波かっこ { } であって、見た目のインデントではありません。人間はインデントを見て「ここまでが if の中身だな」と読みますが、コンパイラは { } しか見ていません。この食い違いが、このトラックで出てくる事故のかなりの部分を生みます。

流れが頭の中で追えなくなったら、フローチャートで図にするか、トレース表で1行ずつ値を書き出してください。目に見える形にした瞬間に解決することが、本当によくあります。

このトラックのゴールは「書ける」ことだけではありません。書いたものがどう動くか予想できることです。予想と実際がずれた瞬間がバグで、その差を埋める作業がそのままデバッグになります。

まとめます。プログラムの流れは順次・分岐・繰り返しの3つでできている。分岐は if / switch、繰り返しは for / while。範囲を決めるのは { }。次のトピックから、ひとつずつ手を動かしていきます。

要点まとめ

アプリで演習問題まで解く(無料・登録不要)

この項目に出てくる用語

if文いふぶん

条件が真のときだけ、特定の処理を実行させる制御構造のこと。プログラムの中に「もしも」という分かれ道を作る、いちばん基本の道具。条件が偽のときは何もせず、そのまま次の処理へ進んでいく。

switch文すいっちぶん

1つの値がどのケースに一致するかによって処理を振り分ける制御構造のこと。同じ変数に対する多分岐を、if-elseの連鎖より見やすく書ける。整数や文字など、値がぴったり一致するかどうかで振り分けが行われる。

for文ふぉーぶん

「初期化・条件・更新」の3つを1行にまとめて書ける繰り返し構文のこと。回数があらかじめ決まっている繰り返しにとくに向いている。繰り返す回数があらかじめはっきりしている場面で、とくに書きやすい構文。

while文わいるぶん

条件が真である間、処理を繰り返す構文のこと。何回繰り返すかが実行前には分からない場合に向いた、シンプルな繰り返し構文。条件を書き間違えると、意図せず無限ループになってしまうことがある。

フローチャートふろーちゃーと

処理の流れを四角形やひし形などの図形と矢印で表した図。分岐やループの構造が一目で分かるため、手順を設計するときの地図の役割を果たす。四角形は処理、ひし形は分岐というように、図形ごとに意味が決められている。

トレース表とれーすひょう

プログラムを1行ずつ実行したときの、各変数の値の変化を表にまとめたもの。頭の中でコンピュータになりきって処理を追いかける道具にあたる。変数の値がどう変わっていくかを紙の上で追うことで、頭の中の実行イメージがはっきりする。

同じトラックのほかの項目

if文——もしも、の分かれ道if文の書き方と条件式の考え方を理解し、条件によって処理を分けられるようになる else if / else の分かれ道設計else / else if で複数の分かれ道を作れるようになり、範囲判定の順序を正しく設計できる 条件式の罠——= と == の悲劇代入 = と比較 == の違いを説明でき、条件式で取り違えたときに何が起きるかを見抜ける 論理演算子と短絡評価&& || ! で複数の条件を組み立てられるようになり、短絡評価の性質を安全のために利用できる switch文とfallthroughswitch文で値による多分岐を書けるようになり、break忘れによるフォールスルーを理解する for文——回数が決まった繰り返しfor文の3つの部品と実行順序を理解し、回数の決まった繰り返しを正しく書ける while文——条件が決める繰り返しwhile文で終わりの読めない繰り返しを書けるようになり、for との使い分けを判断できる do-while文と入力チェックdo-while の「まず1回は実行する」性質を理解し、入力のやり直しループを書ける breakとcontinueの使いどころbreak でループを打ち切り、continue で残りをスキップできるようになり、それぞれの副作用を避けられる ループのネストと九九表二重ループの動きを説明でき、九九表のような表形式の出力を自分で組み立てられる 無限ループとの付き合い方無限ループの原因を3つの型で診断でき、意図的な無限ループを出口つきで安全に書ける
if文——もしも、の分かれ道 ›

もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。

完全版(BOOTH)を見る

📚 姉妹教材:手を動かして覚える Linux 教材 — Linuxとインフラの仕組みを地図で学ぶ

Web版 / BOOTH