講義メモ ・p.087「else if文をif文にすると」及び、if文のネストについての補足、多分岐構造の補足(switch文)から 提出フォロー:アレンジ演習:p.081 Chap2_6_1:つづき② ・上記の変更を元に戻してから、ageが負の数であれば「負の数は用いない」と表示する処理を追加しよう 作成例 //アレンジ演習:p.081 Chap2_6_1:つづき② using UnityEngine; public class Chap2_6_1 : MonoBehaviour { public int age; void Start() { if (age < 0) { //【追加】ageの値が0未満? Debug.Log("負の数は用いない"); //【追加】表示 } else if (age < 20) { //【変更】ではなくてageの値が20未満? Debug.Log("未成年"); //表示 } else if (age < 65) { //ではなくて(20以上で)65未満? Debug.Log("成人"); //表示 } else { //上記のどれもなければ(65以上?) Debug.Log("高齢者"); //表示 } } } p.087「else if文をif文にすると」 ・これはif文の連続時に起こりやすいミスで、文法エラーや実行時エラーにならず、警告も表示されないで、注意が必要 例:正しい場合  if (条件①) {   処理内容①  } else if (条件②) {   処理内容②  } 例:誤った場合  if (条件①) {   処理内容①  } if (条件②) { //ここがミスの原因(elseの抜け)   処理内容②  }  ↓ 実際は下記の構文とみなされてしまう  if (条件①) {   処理内容①  }  if (条件②) { //ここがミスの原因   処理内容②  } アレンジ演習:p.085 Chap2_6_1.cs:つづき③ ・つづき②の変更内容を元に戻してから: ・「else if」を「if」にわざと誤って、どういう動作になるか確認しよう  ⇒ageが20未満だと「未成年」「成人」の両方が表示されてしまう 作成例 //アレンジ演習:p.085 Chap2_6_1.cs:つづき③ using UnityEngine; public class Chap2_6_1 : MonoBehaviour { public int age; void Start() { if (age < 20) { //ageの値が20未満? Debug.Log("未成年"); //表示 } if (age < 65) { //【変更】「ではなくて(20以上で)」がなくて65未満? Debug.Log("成人"); //表示 } else { //上記のどれもなければ(65以上?) Debug.Log("高齢者"); //表示 } } } if文のネストについての補足 ・ifのブロック内や、elseのブロック内に、さらにif文を記述できる ・これをif文のネストといい、条件の整合性やelseの後の合流に注意 例:aが偶数か奇数かを表示する。偶数の場合は4の倍数かどうかも表示する  if (a % 2 == 0) {   「偶数です」   if (a % 4 == 0) { //ネストにすると効率が良い    「4の倍数です」   }  } //ここまでが偶数の処理  else { //偶数でなければ奇数なので   「奇数です」  } 誤った例:  if (a % 2 == 0) {   「偶数です」   if (a % 4 == 0) { //ネストにすると効率が良い    「4の倍数です」   }  //ここまでが偶数の処理…のつもりが…  else { //内側の「if (a % 4 == 0)」のelseとみなされてしまう   「奇数です」  } //この後ろで「}」が足りない文法エラーになってしまう ・if文のネストは可能な限り論理演算子(p.088)を用いて回避すると良い(上の例は回避できないが) 多分岐構造の補足(switch文) ・if-else if-else構文による多分岐構造をより見やすくできる文法としてswitch文が提供されている ・利用には条件があるが、可能な限り利用することで可読性・保守性が向上する  ※ switch文はC/C++/C#/Javaなどで利用可能だが、文法に差異があるので注意 ・書式:  switch (整数式か文字列式) {  case 整数値か文字列① : ①の場合の処理; …; break;  case 整数値か文字列② : ②の場合の処理; …; break;  :  default : 上記のどれでもない場合の処理; …; break; //省略可  }  ※整数と文字列が可能で、実数は利用不可  ※caseには値(または値を返す式)のみが可能なので「以上」「以下」などは表現できない  ※場合の処理が1文しかなくても「break;」は必要  ※C/C++などでは「break;」を省略する特殊技法があるが、C#では不可 ・例:if-else if-else構文の場合  if (a == 0) {   Debug.Log("0です");  }  else if (a == 1) {   Debug.Log("1です");  }  else {   Debug.Log("0、1以外です");  } ・例:これをswitch文にすると非常にシンプルになる  switch (a) { //aの値で分岐する  case 0 : Debug.Log("0です"); break;  case 1 : Debug.Log("1です"); break;  deault : Debug.Log("0、1以外です"); break;  } ミニ演習 mini087.cs ・int型のパブリック変数aの値により、0なら「グー」1なら「チョキ」2なら「パー」を表示しよう ・switch文を利用し、0,1,2以外であれば「なし」と表示すること 作成例 //ミニ演習 mini087.cs using UnityEngine; public class mini087 : MonoBehaviour { public int a; void Start() { switch (a) { case 0 : Debug.Log("グー"); break; //0の場合 case 1 : Debug.Log("チョキ"); break; //1の場合 case 2 : Debug.Log("パー"); break; //2の場合 default: Debug.Log("なし"); break; //上記以外の場合 } } } 多分岐構造の補足(switch文)つづき ・整数型と文字列に対応するが、char型は内部的に整数の文字コードになるので、switch文で利用可能   ミニ演習 mini087a.cs ・char型のパブリック変数aの値により、'a'なら「apple」'b'なら「banana」'c'なら「choco」を表示しよう ・switch文を利用し、'a','b','c'以外であれば「なし」と表示すること 作成例 //ミニ演習 mini087a.cs using UnityEngine; public class mini087 : MonoBehaviour { public char a; void Start() { switch (a) { //文字aの文字コードにより分岐 case 'a' : Debug.Log("apple"); break; //aの場合 case 'b' : Debug.Log("banana"); break; //bの場合 case 'c' : Debug.Log("choco"); break; //cの場合 default : Debug.Log("なし"); break; //上記以外の場合 } } } p.088 複数の比較式を組み合わせる:論理演算子(2項&&演算子) ・2項&&演算子:左辺と右辺がbool型の時、どちらもtrueなtrueを、でなければfalseを返す ・よって「アンド」「かつ」とも呼ばれる ・ifの条件式に用いると「if(条件① && 条件②) { ①②が共にtrueの時の処理 }」とできるので、2条件の「かつ」に該当する ・なお、この場合、①だけや②だけがtrueの場合、実行されない ・よって、2項&&演算子は値の範囲チェックに便利:  「if(変数 > 下限 && 変数 < 上限) { 変数の値が下限と上限の間の時の処理 }」 ・ただし、条件①と②が同時には成立できない場合、絶対にtrueにならないので注意  例: if(a < 5 && a > 10) {ここに何を書いても実行されない} ・なお、比較式が複雑になっても起こりえる全パターンをテストする必要がある  例:「変数の値が下限と上限の間」の場合、正常値に加えて「変数の値が下限以下」「上限以上」の2値もチェックが必要 アレンジ演習:p.089 Chap2_7_1 ・ageが負の数の場合は「負の数は対象外」と表示しよう ・なお、全パターンをテストする必要がある(②と④は何も出ないが別パターン)  ①負の数 ②正の数で6未満 ③6以上15以下 ④15超 作成例 //アレンジ演習:p.089 Chap2_7_1 using UnityEngine; public class Chap2_7_1 : MonoBehaviour { public int age; void Start() { if(age >= 6 && age <= 15) { //ageの値が6以上かつ15以下? Debug.Log("義務教育の対象"); } else if(age < 0) { //ではなくてageの値が0未満? Debug.Log("負の数は対象外"); } } } 補足:複数の2項&&演算子 ・2つ以上の2項&&演算子を並べて3つ以上の条件式を記述できる  例: if (a == 0 && b == 0 && c == 0) {a,b,cがすべて0の場合の処理} ・なお、このような記述をすると、最初の方の条件式がfalseになると、後続の条件式は(trueになってもfalseになっても全体はfalse確定なので)評価されず、誤りが発見されづらいので注意 補足:短絡評価(ショートサーキット) ・上記の例のように、複数の比較式を組み合わせた時に、最初の方の条件式の評価により、全体の評価が確定してしまうことがある ・この時に、処理効率と安全性の向上の為に、それ以降の評価を行わないことを短絡評価という ・短絡評価は対応している演算子が2つあり、2項&&演算子と2項||演算子(後述) ・2項&&演算子の場合、最初の方の条件式がfalseになると、後続の条件式は(trueになってもfalseになっても全体はfalse確定なので)評価しない ・これは、誤りが発見されづらいというデメリットがある ・安全性の向上の例として「整数によるゼロ除算の防止」がある  例: if (a != 0 && 5 / a > 2) {…} //aが0だと「5/0」は実行されないので異常終了しない  例: if (5 / a > 2 && a != 0) {…} //aが0だと「5/0」が実行されて異常終了 p.088 複数の比較式を組み合わせる:論理演算子(2項||演算子) ・2項||演算子:左辺と右辺がbool型の時、どちらか片方か両方がtrueならtrueを、でなければfalseを返す ・つまり、どちらもfalseなfalseを、でなければtrueを返すので、2項&&演算子の逆の忌になる ・よって「オア」「または」とも呼ばれる ・ifの条件式に用いると「if(条件① || 条件②) { ①②の片方か両方がtrueの時の処理 }」とできるので、2条件の「または」に該当する ・なお、この場合、①②が共にfalseの場合、実行されない ・よって、2項||演算子は値の範囲外チェックに便利:  「if(変数 < 下限 || 変数 > 上限) { 変数の値が範囲外の時の処理 }」 ・ただし、条件①と②が同時に成立する場合、想定外の動作になることに注意  例: if(a > 0 || a < 10) {ここは常に実行される} アレンジ演習:p.090 Chap2_7_2 ・ageが負の数の場合は「負の数は対象外」と表示しよう  ⇒先にチェックしないと「幼児」になってしまうので注意 作成例 //アレンジ演習:p.089 Chap2_7_2 using UnityEngine; public class Chap2_7_2 : MonoBehaviour { public int age; void Start() { if(age < 0) { //ageの値が0未満? Debug.Log("負の数は対象外"); } else if(age <= 5 || age >= 65) { //ではなくてageの値が5以下または65以下? Debug.Log("幼児と高齢者"); } } } 補足:複数の2項||演算子 ・2つ以上の2項||演算子を並べて3つ以上の条件式を記述できる  例: if (a == 0 || b == 0 || c == 0) {a,b,cどれかが0の場合の処理} ・なお、このような記述をすると、最初の方の条件式がtrueになると、後続の条件式は(trueになってもfalseになっても全体はtrue確定なので)評価されず、誤りが発見されづらいので注意 ・つまり、2項&&演算子と同様に短絡評価が起こる ・2項&&演算子の安全性の向上の例と同様のことができる  例: if (a == 0 || 5 / a > 2) {…} //aが0か、または、5/aが2超? 補足:2項&&演算子と2項||演算子の併用と優先度 ・2項&&演算子と2項||演算子の併用が可能だが、2項&&演算子が優先なので注意 ・例: if (a == 0 || b == 0 && c == 0) //先にbとcが共に0かを評価  ※チームルールによってはカッコをつけることを義務とする場合がある  例: if (a == 0 || (b == 0 && c == 0)) //先にbとcが共に0かを評価 p.088 論理演算子(単項!演算子) ・右辺がbool型であれば、その値をtrue⇔false反転した結果を返す  ※変数値を書き換えるわけではないので注意(書き換えるには代入が必要)  例: bool a = true, b = !a; //bはfalseになるが、aはtrueのまま  例: bool a = true; a = !a; //aはtrueからfalseになる ・単項!演算子は、bool型の値を返すメソッドを用いて得られる結果を反転したいときに便利  例:Mathf.IsPowerOfTwo(整数)は、整数が2のべき乗値ならtrueを返す   よって、if(!Mathf.IsPowerOfTwo(整数)) { 整数が2のべき乗ではないときの処理 } 提出:アレンジ演習:p.091 Chap2_7_3 ・「9」をパブリック変数で与えるようにしよう ・変数値を用いて「●は2のべき乗ではない」と表示するようにしよう ・パブリック変数が負の数の場合の動作を確認しよう 次回予告:p.092「エラーメッセージを読み解こう②」から再開して、Chapter3に進みます