C#のIf文、Switch文をざっくり勉強していきましょう!
C#のと言ってますが、ほとんどのプログラミング言語共通の書き方なので一度覚えてしまえば、他の言語で使う時も対応はすぐに可能ですね(^_^)v
今回もUnity付属のMonoDevelopを使用してスクリプトの記述をしていきます。
If文
If文はその名のとおり「もし」を判定する条件文を記述出来るものです。
例えば、
と条件によって処理を分けたい時に使います。
条件が成立した中でさらに条件を判定する。と言った事も出来ます。
If文の書き方
If文の書き方は
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | // if文 if (条件式) { // 条件が成立した時に実行 } // if-else文 if (条件式) { // 条件が成立した時に実行 } else { // 条件が成立しなかったら実行 } // if-else if-else if (条件式) { // 条件が成立したら実行 } else if (条件式) { // 条件が成立したら実行 } else { // 条件が成立しなかったら実行 } |
↑のように単一の条件が成立した時のやり方、ifとelseで最初の条件が成立したかしないかのやり方、if-else if-elseを使って一つ一つ条件が成立するかどうかを判定するやり方があります。
条件式に何を記述するのか?
条件式の部分には条件を書きますが、条件として判定するのはbool値(真偽値)でtrueかfalseの値を返す式を記述する必要があります。
その為、条件式にtrueやfalseそのものを書くと言う事も出来ます。
1 2 3 4 5 | if (true) { // この処理は常に実行される } |
条件式にはbool値を指定すればいいので、式を指定する事が出来ます。
1 2 3 4 5 6 7 8 9 | if (5 < 10) { // この処理は常に実行される } if (5 == 5) { // この処理は常に実行される } |
↑のように5 < 10という式は5は10より小さい為、bool値のtrueが得られるのでif文内の処理は実行されます。2番目のif文では比較演算子を使い同じ値かどうかを判定しています。メソッドでbool値を戻り値にしていれば、
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | using UnityEngine; using System.Collections; public class Learn3_1 : MonoBehaviour { // Use this for initialization void Start () { if (Check()) { Debug.Log ("実行"); } } private bool Check() { return 5 < 10; } } |
↑のように条件式内にメソッド呼び出しも入れる事が出来ます。メソッド呼び出しでint型の値を得られたとしたら、その値を使って式を作り条件に設定する事も出来ます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | using UnityEngine; using System.Collections; public class Learn3_1 : MonoBehaviour { // Use this for initialization void Start () { if (Check() < 2) { Debug.Log ("実行"); } } private int Check() { return 1; } } |
条件式を反転する時は!記号を使います。さきほどの条件式を反転してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | using UnityEngine; using System.Collections; public class Learn3_1 : MonoBehaviour { // Use this for initialization void Start () { if (!(Check() < 2)) { Debug.Log ("実行"); } } private int Check() { return 1; } } |
↑でCheckメソッドを呼び出して1が返ってきて、その後(1 < 2)という条件式でtrueになりますが、その後!で反転しているので結果としてfalseになります。ifの中を書き換えると、
1 2 3 4 5 | if (!true) { Debug.Log ("実行"); } |
↑のようにtrueを反転してfalseになっているのと同じなので、if文内の処理は実行しません。
条件文のネスト
条件式が成立した時にその中でさらに条件を絞ると言う事も出来ます。
1 2 3 4 5 6 7 8 9 10 11 12 | // If文のネスト if (条件式) { if(条件式){ // 条件が成立したら実行 } else { // 条件が成立しなかったら実行 } } else { // 条件が成立しなかったら実行 } |
ただし、複雑にネスト(階層を深くする)をした条件文を作成すると、後で解析する時に大変になるので、なるべく深い階層は作らない方がいいです。
文字を見ただけじゃわからないので実際に作ってみましょう。
お金が200円以上あればケーキを買い、120円以上あればジュースを買う、100円より少なく50円以上あればお菓子を買い、なければ何も買わない
という条件文を作ってみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | using UnityEngine; using System.Collections; public class Learn3_1 : MonoBehaviour { // Use this for initialization void Start () { // 持っているお金 int money = 40; if (money >= 150) { Debug.Log ("ケーキを買う"); } else if (money >= 120) { Debug.Log ("ジュースを買う"); } else if (money < 100) { if (money >= 50) { Debug.Log ("お菓子を買う"); } else { Debug.Log ("何も買わない"); } } } } |
持っているお金をmoneyとし条件文を書きました。
↑を実行するとコンソールに『何も買わない』と表示されます。
何も買わないって・・・( ノД`)シクシク…
論理演算を使って複数条件を設定
条件式には論理演算を使って複数の条件を設定する事が出来ます。
If文でよく使うのは論理積(AND)と論理和(OR)ですね。
論理積は全ての条件が真の時成立し、論理和の場合はどれかの条件が真の時成立します。
論理積は&&記号、論理和は||記号で表す事が出来ます。
1 2 3 4 5 6 7 8 9 10 11 | int intValue = 5; if(1 < intValue && intValue < 10) { Debug.Log("intValueは1より大きく10より小さいです。"); } if(intValue < 5 || 5 < intValue) { Debug.Log("intValueは5より小さいまたは5より大きいです。"); } |
↑の例では1番目のIf文は実行され、2つ目のIf文は実行されません。
intValueの値を10にすると、1番目のIf文は実行されず、2番目のIf文は実行されます。
先ほどの持っているお金によって条件分岐をさせたIf文を&&を使って書き換えると
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | using UnityEngine; using System.Collections; public class Learn3_2 : MonoBehaviour { // Use this for initialization void Start () { // 持っているお金 int money = 40; if (money >= 150) { Debug.Log ("ケーキを買う"); } else if (money >= 120) { Debug.Log ("ジュースを買う"); } else if (50 <= money && money < 100) { Debug.Log ("お菓子を買う"); } else { Debug.Log ("何も買わない"); } } } |
となります。
この&&と||ですが、最初の条件が成立されなかった場合次の条件判定をせずに終了します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | using UnityEngine; using System.Collections; public class Learn3_3 : MonoBehaviour { // Use this for initialization void Start () { if (Check1() && Check2()) { Debug.Log ("実行"); } } private bool Check1() { Debug.Log ("Check1"); return false; } private bool Check2() { Debug.Log ("Check2"); return true; } } |
↑の例でいくと、Check1メソッドではfalseが返ってくる為、Check2メソッドは実行しないのでコンソールに「Check2」は表示されません。
&と|を使えば条件が成立しなくても実行します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | using UnityEngine; using System.Collections; public class Learn3_4 : MonoBehaviour { // Use this for initialization void Start () { if (Check1() & Check2()) { Debug.Log ("実行"); } } private bool Check1() { Debug.Log ("Check1"); return false; } private bool Check2() { Debug.Log ("Check2"); return true; } } |
演算子に関しては
で詳しく解説されていますので、参照してください。
Switch文
Switch文を使うと条件に合わせた処理を行う事が出来ます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | switch (数値) { case 1: // 数値が1だったら実行 break; case 2: case 3: // 数値が2か3だったら実行 break; default: // どの条件にも合致しなければ実行 break; } |
↑のように数値によって分岐させています。
breakでその条件の実行を終了します。
条件に合致した時の処理を記述しない時で、breakを記述しなければその下のケースを実行します。
↑の例では数値が2、3だった時は同じ処理が実行されることになります。
実際にSwitch文を使ってみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | using UnityEngine; using System.Collections; public class Learn3_5 : MonoBehaviour { // Use this for initialization void Start () { int intValue = 2; switch (intValue) { case 1: Debug.Log ("1"); break; case 2: case 3: Debug.Log ("2or3"); break; default: Debug.Log ("default"); break; } } } |
↑の例ではintValueが2なので「2or3」をコンソールに出力します。
C#のバージョンによっては数値以外で条件分岐をする事が出来るみたいです。
その辺りは
C#リファレンスを参照してください。
わたくしのMonoDevelopはC#3.0バージョンかなぁ?
おわりに
最初はこの記事で、If、Switch、For、ForEach、Whileを全てまとめてやろうとしたんですが、例によってIf文だけで長くなってしまいましたのでIf文とSwitch文のみにしました・・・(^_^;)
For、ForEach、Whileを長くなっても纏めてやってみようと思います。<(`^´)>