プログラムは、書いた順に上から下へ実行されます。カレーのレシピと同じです。
ところが、実際のレシピにはこんな行がありませんか。「まだ固ければ、もう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;
}ここで先に釘を刺しておきます。流れの範囲を決めているのは、波かっこ { } であって、見た目のインデントではありません。人間はインデントを見て「ここまでが if の中身だな」と読みますが、コンパイラは { } しか見ていません。この食い違いが、このトラックで出てくる事故のかなりの部分を生みます。
流れが頭の中で追えなくなったら、フローチャートで図にするか、トレース表で1行ずつ値を書き出してください。目に見える形にした瞬間に解決することが、本当によくあります。
このトラックのゴールは「書ける」ことだけではありません。書いたものがどう動くか予想できることです。予想と実際がずれた瞬間がバグで、その差を埋める作業がそのままデバッグになります。
まとめます。プログラムの流れは順次・分岐・繰り返しの3つでできている。分岐は if / switch、繰り返しは for / while。範囲を決めるのは { }。次のトピックから、ひとつずつ手を動かしていきます。