さて、前回までで変数とメソッドについて学習してきました。まだなんとなーくでしか理解できてない人も、まぁ大丈夫です。今回はプログラミングらしいことをしてみたいと思います。
↑の動画でも解説しています。ちょっと今回の解説は文章だとややこしいので、わからなさそうなら動画の方も是非ご活用ください
この記事は本のように順を追って解説しています。この記事は途中のページになります。
この記事を見ていて、現在の状況がわからない場合や忘れてしまった事などが出てきたら↓のリンクから目次ページへ飛べますので立ち戻って見てください。
<条件分岐とは>
プログラムを組んで行く上で、条件分岐というものをよく使う事になると思います。これはどういうものかというと、○○だったらAをして△△だったらBをしてみたいな感じです。
ゲーム作りでよくあるものでいうと、Bボタンを押したらジャンプして、Aボタンを押したら周囲を調べるみたいな感じです。
この「〇〇をしたら」という部分が条件分岐になります。
こういった物を実装するために条件分岐のやり方を解説していこうと思います。
<if>
もし○○なら〜〜をする
C#の基本的な命令でifというものがあります。基本的な命令ってなんやねんって話ですが、C#に最初から入ってる機能ですね。
ifは「もし〜なら」という意味ですが、プログラミングでも一緒です。
if(○○)
{
// もし○○ならここが実行される
}
↑のように条件が当てはまれば{ }の中を実行する感じになります。
違う条件場合の処理を書きたかったら
if(○○)
{
// もし○○ならここが実行される
}
else
{
//もし○○でなかったらここが実行される
}
ifの後にelseと書くことで○○でなかった場合の処理を書くことができます。
まぁ、とりあえず実際にやってみましょうか。
↑の文はもし「a>0」なら「ifの{ }の中」を通ります。
もし「a>0とは違う」なら「elseの{ }の中」を通ります。という意味です。
aは1なので、絶対「if{ }の中」を通ります。
そのためコンソールウィンドウに「aは0より大きいです」とだけ表示されます。
もし○○でなく△△なら
また、こんな風に条件を増やすこともできます。
もし、a>0だったら一番上を通り、aが0だったら真ん中を通り、それ以外だったら一番下を通ります。
このように、else if()と書くことでもし〜だったらの分岐を増やすことができます。
この時、複数の条件を満たすことがあったとしても、上に書かれたものが優先的に選ばれます。
こんな感じですね。
この場合一番上と真ん中の両方を満たしていますが、一番上しか通りません。
これを実行してもコンソールウィンドウに「 aは0より大きいのでここを通ります。 」という1文だけ表示されます。
ちなみに、else ifとかelseとかは別にいらなかったら書かなくても大丈夫です。
このように条件によって処理を切り分ける事ができ、いろんなところで使うので覚えておいてください。
<条件式とは>
さて、a > 0とかa == 0とか自然に書いてましたが、これを条件式と言います。
「もし○○なら」の○○は条件ということですね。
基本的な条件式
さて、では基本的な条件式をあげてみようと思います。
A == B | AとBは等しい |
A != B | AとBは等しくない |
A < B | AはBより小さい |
A > B | AはBより大きい |
A <= B | AはB以下 |
A >= B | AはB以上 |
これらの条件式で使う演算子(==とか)を関係演算子と言います。
またこの中でややこしいのが、大きい小さいと以上以下です。(まぁ、学校で習うので知っている人も多いかと思いますが一応解説します)
○○より小さい大きいは○○の値を条件に含みません。
「1 < 1」は1を含まないのでfalseです。
○○以上以下は○○の値を条件に含みます。
「1 <= 1」は1を含むのでtrueです。
このようになります。=が入っているか入っていないかでイメージがつきやすいと思います。
ここで注意していただきたいのは「以上以下」での「=」は必ず右側にある点です。ここ間違えると結果が大きく変わってしまうので気をつけましょう。
左側にあるとまた別の意味になってきます。条件式ではなくなってしまうのでここでの解説は省きます。
bool型
さて、条件式について解説してきましたが、実はこれは1つの型です。
bool型と言って、真か偽かを表します。
プログラムでは真をtrue,偽をfalseと書きます。
int a = 1;
if(a > 0)
{
}
else if (a == 0)
{
}
この場合、a = 1なので
a > 0 は「true」 : ○ 条件にあっているよということです。
a == 0 は 「false」 : × 条件にあっていないよということです。
つまり条件式はtrueかfalseのbool型ということになります。
C#が勝手に中で計算してくれているのでいちいち型を書く必要がなかった感じです。
↑の例を書き直すと
このように書くこともできます。
条件式はbool型なので変数にして代入することができるわけです。
これを実行すると
という出力が得られます。
あとなんかサラリとやってしまいましたが、文字列は足し算で繋げられます。
if文の( )の中はbool型でtrueならその中を通ってfalseなら下の条件文に行くみたいな感じです。
ちょっとプログラムっぽくなってきました。
<論理演算子>
さて、↑の例では条件式は1個でした。しかしながら、1個だけの条件というのはなかなかないものです。
○○と△△の両方を満たしていた場合などなど。
例えばRPGでよくある「鍵を入手」していて「村人と会話している」場合のみ発生するイベントとか。
使い所はたくさんあります。
ということで、次は条件式を複数にしてみたいと思います。
複数の条件式で使う論理演算子
さて、複数の条件式を取り扱うにあたって覚えておくことがあります。
それは
○○または△△
○○かつ△△
です。
「または」というのは○○もしくは△△のどちらか一方でもtrueだった場合条件を満たしているという意味です。
「かつ」というのは○○と△△の両方がtrueだった場合のみ条件を満たしているという意味になります。
このように「または」と「かつ」で複数の条件式を扱うわけです。
ではこれをプログラムで書くとどうなるかというと
○○ | △△ で「または」になります。Lではなく「キーボードのShift + ¥」です。
○○ & △△ で「かつ」になります。
この「 | 」と「 & 」を論理演算子と言います。
一例をあげると
int a = 2; if( a > 0 & a < 2) { //a > 0はtrueですが、a < 2はfalseなので「かつ」を満たせません //そのためここは通りません。 } else if( a > 0 | a < 2) { //a > 0はtrueです。a < 2はfalseですが「または」なので条件を満たします //そのためここを通ります。 }
こんな感じに書くことができます。
短絡評価
さて、ここで注意していただきたいのがプログラミングというのは非常に無駄を嫌うということです。
例えば
int a = 2; if( a > 0 | a < 2) { }
↑の場合、条件が「または」なので a > 0がtrueだったら条件を満たします。
そのため、 a < 2まで検証するのは無駄になってしまいます。
プログラムではこの無駄を省くことができます。
このように条件を複数あるにも関わらず、序盤の方で条件を満たした場合、以降の処理をしないことを短絡評価と言います。
やり方は
「&&」と「||」と書きます。
要は↑の論理演算子を2回連続で書くことで計算の無駄を省く短絡評価にすることができます。
プログラムでは何か特別な理由でもない限りただの論理演算子ではなく、短絡評価をすることが多いので覚えておきましょう。
なので基本的には&&と||と2回続けて書けばいいと思います。
では実際にやってみると↓のような感じです。
「&&」が「○○かつ△△」の短絡評価(無駄省きバージョン)
「||(LLではない(キーボードのShift + ¥))」が「○○または△△」の短絡評価(無駄省きバージョン)
です。これは非常によく使うので覚えておきましょう。
条件式をカッコでくくる
さて、条件式の基本はわかってきたと思いますが、残念ながら世の中には非常に複雑な条件が求められる場合があります。
そんな時は条件式を( )でくくってまとめる事によってさらに違う条件を書く事ができます。
ちょっとわかりにくいのでポイントとして↓の点を踏まえてみましょう。
「○○かつ△△」や「○○または△△」というのは○○と△△がbool型であればいい。
○○ && △△ や ○○ || △△ は条件式なのでbool型である。
これを( )でくくって(○○ && △△) や(○○ || △△)とできる。
↑のポイントを踏まえると(○○ && △△) や(○○ || △△)はbool型なので
(○○ && △△) &&(●● || ▲▲)や(○○ && △△) ||(●● || ▲▲)
と書いたりする事ができます。
暗号かよ
いやー、わけわかりませんね。とりあえず実際にやってみましょうか。
↑のような感じです。
頭こんがらがりそうですが、( )でくくることによって条件式の結果をさらに条件式にかけることができます。
内容はコメントに書いてある通りです。
(条件式A) && (条件式B) は条件式AもBも満たした時true
(条件式A) || (条件式B) は条件式AもしくはBのどちらかを満たした時true
ですね。
1個1個ちゃんと分解して見てみればわかると思います。
条件式を一括で書いたパターン
また、( )でくくらずに
a != 0 && a < 0 && b != 1 && b > 0
みたいに連続で書くこともできます。この場合全ての条件を満たさないとtrueになりません。
ちなみに
a != 0 && a < 0 || b != 1 && b > 0
こう書いちゃうと
(a != 0 && a < 0) || (b != 1 && b > 0)
と同じ意味になります。
||のところで途切れちゃう感じになりますね。
このように、唐突に||が出てくると気づかなかったり読みづらくなってしまうので、基本的にはカッコでくくる事をオススメします。
<switch>
さて、if文で条件分岐をしてきました。正直if文だけでも条件分岐を全て網羅する事ができるのですが、if文で全てやりくりするのは大変なので、ちょっと便利な条件分岐を紹介します。
例えば、1つの比較対象で複数の答えに分岐したい場合があったとします。
int a; if(a == 1) { } else if(a == 2) { } else if(a == 3) { } else if(a == 4) { }
その場合、↑みたいな感じでif〜else if〜else if〜・・・と続けていくのは大変です。
こういう場合はswitch文を使った方が楽です。
というわけでswitch文について解説していきます。
switchの使い方
switch文というのは一つの比べるものに対して条件分岐を行うものになります。
例えばaが1なのか2なのか3なのか調べたい場合、「a」という比較対象は「1つ」ですよね。こういった場合にswitch文を使用します。
書き方は
switch(比べる元の値)
{
case 比較する値:
処理;
break;
}
と書きます。
見た方が早いと思うので実際にやってみましょう。
こんな感じで書きます。
aが1なのか2なのか3なのか4なのかどれでもないのかを調べています。
これはcaseの横に書いてある数字ですね。(default以外は)
↑の場合だとa = 1なのでcase 1:のところを通ります。
比べる元の値「a」と「caseに書かれた値」を比較して、等しい場合、そこに書いてある処理を行います。
そこに書いてある処理とはcaseからbreak;までに書いてある処理です。
また、break;と書かずに次のcaseが始まった場合、そのcase以下の処理も行います。
要するに
case A:
処理○○;
case B:
処理△△;
break;
と書かれていた場合、条件Aに当てはまったら○○も△△も行うよ。条件Bに当てはまったら△△を行うよ。という感じになります。
処理○○が書かれていなかった場合、「AまたはB」と同じ意味になります。
ちょっとif文とは違うテイストで条件分岐できるので色々な使い道がありますね。
そして、どの条件にも当てはまらなかった場合、defaultを通ります。
defaultは別に書いても書かなくてもいいです。
さて、これがswitch文の全容になります。if文がわかっていればちょっと応用するだけなのでやりやすいですね。
ちなみに↑の文をif文で書くと
if(a == 0)
{
}
else if(a == 1)
{
}
else if(a == 2)
{
}
else if(a == 3 || a == 4)
{
}
else
{
}
となります。
これだけ書くのはめんどくさいですよね。
このように比較対象が1個の時はswitch文を使うと楽に書く事ができます。
switchの比較対象
switch文の比較対象は1個と書きましたが、別に値が1つに定まればいいので計算式などを書いてもいいです。
switch(a + b + c)とかですね。
この場合、複数の値が含まれていますが、結果1個の解になるので1つの値と言えます。
数学と違ってプログラミングでは不明な値というものは基本ないので絶対に解が求まります。というか値が入ってないとエラーになります。
switch文よりif文を使った方がいい場合
ちなみにあんまりよくない書き方として
↑のような書き方をすると動くは動くけどプログラムとしてあまりスマートではないです。
今までの話的にswitch( )の中には条件式を書けそうな気がしてきます。
が、条件式はbool型なのでこれと比較可能なのはtrueかfalseだけです。
こうやって書くならif文を使った方が簡単でいいかなと思います。
間違いではないですが、ちょっと見づらくなってしまいます。
<まとめ>
さて、いかがだったでしょうか?
条件分岐を学んでもまだよく使い方がわからない人もいるかもしれませんが、もし○○だったらというのは非常によく使うので覚えておいてください。
色々使い道があるので覚えておくと便利ですよ。
次回はループ処理について解説していきたいと思いますのでよろしくお願いします。