講義メモ ・p.039「演算子の優先順位一覧」から p.039 演算子の優先順位一覧 ・演算子の優先順位は丸暗記する必要はないが、想定外の優先順位になる可能性を把握しておこう ・優先順位の影響がありそうな(左から右へ進まないような)式ではカッコをつけてそのことを明示するか表記を工夫すると良い  ※実務ではルールが決められることが多い  例:a + b * c - d ⇒ a + (b * c) - d ⇒ b * c + a - d アレンジ演習:p.040,041 Chap1_7_2.cs + Chap1_7_2.cs ・2つ合わせてChap1_7_2.csとして実行し確認しよう ・また、以下の式を追加して、結果を確認しよう  3 / 2.0 - 1.0  3 / 2 - 1.0 作成例 using UnityEngine; public class Chap1_7_2 : MonoBehaviour { void Start() { Debug.Log(2 + 10 + 5); //整数2,10,5の整数加算結果17を得て表示 Debug.Log(2 + 10 * 5); //整数10と5の整数積50と整数2の整数和52 Debug.Log(3 / 2.0 - 1.0); //3÷2.0の実数商1.5から-1.0で0.5 Debug.Log(3 / 2 - 1.0); //3÷2の整数商1から実数-1.0で0.0(表示は0) } } p.042 カッコを使って計算順を変える:補足 ・優先順位を誤解しやすい演算子にシフト演算子がある ・シフト演算は値を2進数として扱ってビット単位で左右にずらす仕掛けで、動作が非常に高速なこと、2のべき乗の乗除算を代用できることから、活用されやすい ・例えば、1ビット左シフトすると2倍になる  ① 10進数5は内部では2進数の00000101  ② 1ビット左シフトすると 00001010 となり、これは10進数の10 ・例えば、2ビット右シフトすると1/4になる  ① 10進数28は内部では2進数の00011100  ② 2ビット右シフトすると 00000111 となり、これは10進数の7 ・便利だが、加減乗除より優先順位が低いので注意。カッコをつけることを推奨  例: 28 ÷ 4 + 10 ⇒ (28 >> 2) + 10 アレンジ演習:p.042 Chap1_7_3.cs ・以下の式を追加して、結果を確認しよう  (28 >> 2) + 10  28 >> 2 + 10 作成例 using UnityEngine; public class Chap1_7_3 : MonoBehaviour { void Start() { Debug.Log((2 + 10) * 5); //整数2と10の整数和と5の整数積⇒60 Debug.Log((28 >> 2) + 10); //28を右2シフト(1/4)して10を加算⇒17 Debug.Log(28 >> 2 + 10); //28を右(2+10)シフト(1/2の12乗)⇒0 } } p.042 カッコの中にカッコが入れ子になった式 ・ある構造の中に同じ構造があることを「入れ子」という ・C#では、()による入れ子に加えて、{}や[]による入れ子の構造が無制限に利用可 ・ただし、読みづらくなることが多いので後述の変数などを用いて、入れ子の数を少なめにすることが望ましい ※ Chap1_7_4.csではカッコの前後の空白の有無が乱れており、開けるか開けないかを決めておくと良い(実務ではルールが決められることが多い)  例: Debug.Log( 5 / ( 4 * ( 1 - 0.2 ) ) ); //すべて開ける  例: Debug.Log(5 / (4 * (1 - 0.2))); //演算子の前後のみ開ける p.043 負の数を表す「-」 ・数学では負の数を表す「-」は、C#では単項-演算子と呼ばれる演算子 ・単項-演算子は「1つのデータを得て、符号を反転した結果を返す」もの ・よって「-5」なども1つの計算式で「整数5の符号を反転した結果の整数-5を返す」 ・計算式なので、入れ子構造も可能で「-(-5)」とすると「整数5の符号を反転した結果の整数-5の、符号を反転した結果の整数5を返す」 ・このことは変数の値の符号を反転することに関わるので重要 ・なお、単項-演算子の優先順位は加減乗除より高い ・ちなみに、単項+演算子もあるが意味は「1つのデータを得て、その値を返す」で「+5」も1つの計算式 ・また、引き算の「-」は2つのデータを扱うので2項-演算子と呼ばれ、単項-演算子とは異なる演算子 アレンジ演習:p.042,043 Chap1_7_4.cs + Chap1_7_5.cs ・2つ合わせてChap1_7_5.csとして実行し確認しよう ・また、以下の式を追加して、結果を確認しよう  -(-5)  -(2 - 10) 作成例 using UnityEngine; public class Chap1_7_5 : MonoBehaviour { void Start() { Debug.Log(5 / (4 * (1 - 0.2))); //⇒1.5625 Debug.Log(2 + 10 * -5); //5の符号を反転し10との積を2に加算⇒-48 Debug.Log(-(-5)); //5の符号を反転した結果の符号を反転⇒5 Debug.Log(-(2 - 10)); //2から10減算した結果の符号を反転⇒8 } } p.044 変数とは ・英語のvariable value(変わり得る値)の和訳で「変わった数」ではない ・記憶域(メモリ)を必要分確保して名前をつけたもの ・よって、データを格納する器のイメージを持つ ・C#などでは、事前に変数を宣言しておく必要があり、宣言によって確保される  ※ Python、JavaScriptなどでは宣言不要で初回利用時に確保される ・宣言の書式: データ型 変数名; ・データ型を指定することで「確保すべき大きさ」と「格納するデータの特性」を明示する ・データ型にはstring(p.044:文字列型)、double(p.046:倍精度浮動小数点数(実数)型)、int(p.057:整数型)などがある ・宣言の書式例: string text; //文字列型の変数textの宣言(textが変数名) ・変数に与えるデータを値といい、値を格納することを代入という ・宣言と同時に最初の値(初期値)を代入することを初期化という ・初期化の書式: データ型 変数名 = 値や式; ・なお、この書式の「=」は代入に用いる2項=演算子であり「等しい」という意味はない(元は「←」記号)  ※ちなみに「等しい」は「==」(2項==演算子)で示す ・初期化の書式例: string text = "ハロー!"; //文字列型の変数textの初期化 p.045 変数を作成してその値を代入する ・タイトルに誤りがあり「変数を初期化してその値を利用する」が正しい ・初期化した変数はそれ以降で利用できる ・例えば、Debug.Log(初期化済の変数名) とすると、変数に格納されている値が表示される ・格納された値は何度でも利用できるのがポイント アレンジ演習:p.045 Chap1_8_1.cs ・「Debug.Log(text);」をもう1行記述して、同じ値が2度表示されることを確認しよう 作成例 using UnityEngine; public class Chap1_8_1 : MonoBehaviour { void Start() { string text = "ハロー!"; //文字列型の変数textの初期化 Debug.Log(text); //変数textに格納されている値を表示⇒ハロー! Debug.Log(text); //変数textに格納されている値を表示⇒ハロー! } } p.045 変数を使うメリットは? ・初期化には値に加えて式も指定できる ・例: double p = 3.14 * 10 * 10; //半径10の円の面積で初期化 ・式には初期化済の変数を利用できる ・例: double pi = 3.14; Debug.Log(pi * 10 * 10); //半径10の円の面積を表示 ・よって、初期化にも初期化済の変数を用いる式を指定できる ・doubleは倍精度浮動小数点数の「倍」が由来で、64ビット分の誤差が小さい実数を扱える ・よって、double型の変数の初期化では実数値を指定できるが、整数値も指定可能で、自動的に実数に変換されてから格納される  ※このことを暗黙の型変換という ・例: double kakaku = 100; //100.0に自動変換されて初期化 ・初期化においては基本的にその型の値を用い、暗黙の型変換もできない場合、文法エラーになる ・エラーの例: double kakaku = "ハロー!"; //文字列によるdouble型変数の初期化は不可 アレンジ演習:p.046 Chap1_6_2.cs ・エラーの例「double text = "ハロー!";」を追記してどういうエラーになるか確認しよう ・確認後「//」を前置してコメントにすること(コメントアウトという) 作成例 using UnityEngine; public class Chap1_8_2 : MonoBehaviour { void Start() { double kakaku = 100; //100.0に自動変換されて初期化 double urine = kakaku * 1.08; //100.0×1.08→108.0で初期化 Debug.Log(urine); //変数urineに格納されている値を表示⇒108と標示 //double text = "ハロー!"; //文字列によるdouble型変数の初期化は不可 } } p.045 変数を使うメリットは?:続き ・内部で用いる値が将来変更される可能性があったり、その値を複数回用いる場合、リテラルではなく、変数に格納して用いると良い ・例えば、消費税計算を毎回「* 1.1」とする代わりに「* tax」としておき、冒頭で変数taxを税率で初期化すれば、保守性が高い(変更・改良しやすい)プログラムになる ・例:  double tax = 1.1; //税率が変わったらここだけ変更でOK  double book = 1000, magazine = 800; //それぞれの価格を初期化  Debug.Log(book * tax); //税率が変わっても変更不要  Debug.Log(magazine * tax); //税率が変わっても変更不要 参考:VSによるインデントの一括修正機能 ・Ctrlを押しながらA、K、Dの順に押すと指定してあるルールによって、ソースのインデントが一括修正される ・なお、先行する全角空白がある場合、削除してくれる ・他者にソースを見せる前に行うと良い アレンジ演習:p.047 Chap1_8_3.cs ・上記の例を追記して確認しよう 作成例 using UnityEngine; public class Chap1_8_3 : MonoBehaviour { void Start() { double kakaku = 150; //150.0に自動変換されて初期化 double urine = kakaku * 1.08; //150.0×1.08→162.0で初期化 Debug.Log(urine); //変数urineに格納されている値を表示⇒162と表示 double tax = 1.1; //税率が変わったらここだけ変更でOK double book = 1000, magazine = 800; //それぞれの価格を初期化 Debug.Log(book * tax); //税率が変わっても変更不要 Debug.Log(magazine * tax); //税率が変わっても変更不要 } } 参考:文字列型変数と実数 ・文字列型変数を実数値で初期化するとエラーになる ・例:string text = 3.14; //エラーになる ・なお、実数値をダブルクォーテーションで囲んで文字列にすればエラーにならない ・例:string text = "3.14"; //エラーにならない ・ただし、この変数は実数演算の式には使えない ・例:double s = 100 * text; //エラーになる p.048 変数の命名ルールを覚えよう ・C#における変数の命名ルール ① 英大文字、英小文字、数字、「_」、2バイト文字が利用可能  ※ つまり他言語では使える記号(「-」「$」「@」など)はC#では利用不可 ② ただし、先頭には数字は利用不可(よって数字のみも不可) ③ 予約語と完全に同じ名は利用不可  例:using、public、class、void、double、string など p.048 変数の命名ルールを覚えよう:補足 ・文法エラーにははならないが、変数名の命名で推奨されるルールがある  ※実務ではルールが決められることが多い ① 予約語と同じつづりで大文字を混ぜた名前は避ける  例:Using、Public、Class など ② 2バイト文字は避ける(誤読しやすい) ③ 1文字の大文字は避ける(誤読しやすい) ④ 先頭に「_」は避ける(「_」を推奨しない場合もある) ⑤ 長過ぎたり誤解を招く変数名は避ける 提出:アレンジ演習:p.047 Chap1_8_3.cs 次回予告:p.050「スペースの入れどころ」から