第十三話 条件分岐
「じゃ、作るゲームも固まってきたことだし、またCの話の続きをするよー」
立花先輩の言葉で、俺と西原さんは頷く。
「今回は、条件分岐についてのお話をしようと思うの」
「条件分岐?」
先輩はPCへと向き直ると、ウィンドウズのメモ帳を開いてCプログラムを作り始める。
「うん。『もしも』の世界のお話よ。もしも、変数aが0だったら……とか、もしも変数aと変数bが同じ数だったらとかの……よし、出来た」
俺と西原さんは先輩が作ったばかりのコードを覗き込む。
/* IF文のテストプログラム! iftest.c */
#include <stdio.h>
int main(void)
{
int a,b;
a = 1;
b = 2;
if (a == b)
printf("A と B は同じ数です!\n");
if (a > b)
printf("A は B より大きな数です!\n");
if (a < b)
printf("A は B より小さな数です!\n");
return 0;
}
「ifってのが、条件分岐なのか」
「イツキくんも、プログラミングがわかってきたねー。その通りよ。これは二つの変数aとbを比較するプログラムね。ifの後ろのカッコの中が条件式で、これが正(True)だったら、その直後の命令――この場合はprintf関数ね――を実行させるわけ。偽(False)だったら無視して次の行へ移動するの」
「ふむむ。この場合は、a < bだから、最後のやつが実行されるのか」
「じゃ、試してみるわ」
先輩はコマンドプロンプトを立ち上げると、プログラムをコンパイルして実行してみた。
>iftest[ENTER]
A は B より小さな数です!
>_
「やっぱりそうか」と俺は頷く。
「最初のifの条件、イコールが2つついているんですね」と西原さん。
「そうそう。これはC系統の言語のお約束だから、特に気をつけてね。初心者だと (a = b) って間違って書きがちだけど、これだとa変数にb変数の内容を代入するって別の意味になるからね。しかも、変数a、bがゼロでないなら『true』になって後ろの命令も実行されるし、文法上は一応間違ってるわけじゃないから、コンパイラはエラーにも出さない! ……Wallしてたら、一応警告はしてくれるけど」
「そ、そうなのか」
「ちなみに、二つの数が違うかチェックしたい時は、(a != b)って書くから。これは≠の記号を昔のパソコンで書ける文字で真似たらしいわ」
「ほうほう」
「あとねー、こういう書き方もするから、覚えておいて」
if (a == b)
{
printf("A と B は同じ数です!\n");
}
「中カッコで囲むと、その中では二行以上の命令も入れられるのよ。個人的には、一行のみの時にも、この書き方をした方がわかりやすいと思うけど、これは人によって意見はいろいろね」
「ふうむ。なるほど」
「もう一つ。こっちも覚えておいて」
また先輩はカタカタとコードを書き始める。
if (a == b)
{
printf("A と B は同じ数です!\n");
} else {
printf("A と B は別の数です!\n");
}
「else?」
「他の場合は、って訳してね。変数aとbが同じときは、最初の文が実行されてから、elseカッコ内は無視してreturn 0のところへ移動するけど、違うときは、後ろの文が実行されるわけ。あと、else if (a > b) って感じで、elseのあとで別のif文で判定を追加することもできるわよ」
「これだと、詳しく分岐できますね」と西原さん。
「でも、いくつも条件が並んでいたら、if~else文を使うと長くてわかりにくいコードになる時があるわ。そういう時には、switchを使うといいわよ」
先輩はさらにコードを書く。
switch(a){
case 1:
printf("a = 1です ");
break;
case 2:
printf("a = 2なの ");
break;
default:
printf("それ以外だったりして ");
}
「かなり構文が違うな……」
「これは、もしa = 1なら、1番上の文が、2ならその下が……って、幾つでも並べられるわよ。そして、すべてに該当しなかったら、default、デフォルトの文が選ばれるの」
「このbreakは、最後に要るんですか?」
「事実上、ね。言語規定では省いてもいいんだけど、それだと、case 1が選ばれたときに、a = 1です a = 2なの それ以外だったりしてって、三つとも表示されちゃうわ。だから、必要だと思っておいて」
「C#だと、言語規定でもbreakは必須になってますね」と西原さん。
「ま、こんなところね。条件分岐の命令は」
「ふーむ。条件分岐ってのも、奥が深いな……」
「じゃ、最後にさらに奥の深い話をするわよ。if ()の中の判定は、式の結果が0ならfalse、偽となって、それ以外だったら10でも-100でもtrue、正として判定されるの」
「ん??」
「解りにくいかなー。たとえばね、if (0) {}って書いても、絶対に次の中カッコの中は実行されない。常に偽になるからね。if (1) {}だと、常に中カッコの中は実行される。でもこれだと判定する意味ないから、誰もやらないけど」
「そ、そうなのか」
「まー、こういうのは初心者は関係ない話だから、あまり気にしないで。解りにくいトリッキーな書き方はしない方がいいし。じゃ、今回の話はここまで」
先輩はそう言うと、メモ帳を消した。
「次は、反復命令の話をするよー」先輩は言った。「これだけ知ってれば、Cの最低限の知識はマスターしたことになるから、お楽しみにね!」