娘のためにその9:条件分岐・ループ[30分]

娘に読ませる以外の意図はなく、よって質問や指摘には対応していません。すなわちネットの浄化作用が働いていない不正確な内容になりますので、正しい情報を求める方は閲覧をご遠慮ください。公開しているのは、通信手段としての利便性のためです。

さて、条件分岐およびループだ。これはプログラムカウンタと併せて理解すべき内容になる。もし忘れていたなら、復習しておこう。

娘のためにその4:C言語・プログラムカウンタ[15min]

ではまず条件分岐の例を挙げる。

int a = 10;
if (a < 100) {
    a = a + 1;
}

この例では if が登場している。a が 100 未満であれば、次のブロックが実行される。決して難しくないと思うが、{} が必要であること、if の行には ;(セミコロン)が登場していないこと、などに注意が必要だ(こういった細かい文法は慣れていくしかない)。また else というのもあり、

int a = 10;
if (a < 100) {
    a = a + 1;
} else {
    a = a - 1;
}

このように条件を満たさない場合のみ実行する部分を指定することもできる。

こういう if 文で実行する部分を変更する記述を「条件分岐」と呼ぶ。「分岐」というコトバが使われているのは、もしかしたら不思議かもしれない。何が枝分かれしているのか?

プログラムカウンタ(いま実行している場所)が if に差し掛かると、その条件文を評価して真偽を定めたら、次に実行する適切な場所へ「ジャンプ」する。このジャンプを分岐とも言うわけだ。

画像1

このように、条件分岐によりプログラムカウンタがジャンプしている。単に意味を捉えるだけではなく、ひとつずつ実行する仕掛けであるところのプログラムカウンタの存在を忘れてはいけない。

次にループというものを見てみよう。

for (int i = 0; i < 10; ++i) {
    a = a + 1;
}

これは {} の内部を10回実行するプログラムになる。つまりループだ。

for 文は頻繁に使用するので、いずれは暗記する必要があるだろう。この for 文は3つの部分からできている。

for (int i = 0;
     i < 10;
     ++i) {
    a = a + 1;
}

同じプログラムだが for 文の途中に改行を入れてわかり易くしてみた。

for 文はまず、最初に書いてある

int i = 0;

を実行し、次の

i < 10;

が真であるなら {} のブロックを実行する。i < 10 は、i に格納されている数値が10未満であれば真、となる。そして実行し終わったら for 文の3つ目に記述された

++i

を実行する。ちなみに ++i は「1を加える」という意味の記述だ。(なので 実はブロックの中にある a = a + 1; も ++a; と書ける)

このループも、プログラムカウンタの移動を意識して理解しよう。 i < 10 の比較結果で分岐、つまりジャンプするわけだ。

画像2

同じプログラムに注釈を付けてみた。プログラムカウンタはオレンジ色の数字の順番で動いていく。for の記述を確認しながら、1から33までたどってみよう。ここは少し時間をかけて順番を追って欲しい。

通常 for 文を学ぶ場合は、単に「10回実行するための記述」のように教わるだろうが、プログラムカウンタが動いていることを想像できるようになると、理解が深まる。

例えば条件文の部分に関数を記述したら、その関数はどのタイミングで実行されるのか?

for (int i = 0;
     ffff(i);
     i=gggg(i)) {
    a = a + 1;
}

こんなプログラムに遭遇しても、プログラムカウンタの動作を想像できていれば混乱することはないだろう。以下のプログラムを実行して、実行される順番を確認してみよう。

bool ffff(int i)
{
    Serial.println("in the ffff");
    return i < 10;
}

int gggg(int i)
{
    Serial.println("int the gggg");
    return i+1;   
}

void setup()
{
    Serial.begin(9600);
    int a = 0;
    for (int i = 0; ffff(i); i = gggg(i)) {
        a = a + 1;
    }
}

void loop()
{
}

ffff の返り値の型の bool は数学で習うブール代数の意味で、真偽を表す型だ。条件文として要求される型は bool で、値としては true または false (CPUの表現としては 0 が false で 1 が true )となる。

今回はループというものが、条件分岐で動くプログラムカウンタのジャンプにより実現されていることを説明した。ジャンプの記述は、if や for の他にも while や goto などがある。いずれもプログラムカウンタを理解することが大事だ。

つづく

この記事が気に入ったらサポートをしてみませんか?