講義メモ ・p.89「論理演算子」から 提出フォロー:ミニ演習 mini088b.cs・改造 ・コンソールから2つの整数を入力して変数aとbに代入し(p.46参照)、小さい方を表示しよう 作成例 //ミニ演習 mini088b.cs・改造 using System; class mini088a { public static void Main() { Console.Write("a : "); //表示し改行しない int a = int.Parse(Console.ReadLine()); //コンソールから文字列を読み込んで整数化した値で初期化 Console.Write("b : "); //表示し改行しない int b = int.Parse(Console.ReadLine()); //コンソールから文字列を読み込んで整数化した値で初期化 Console.WriteLine("小さい方は{0}", (a < b) ? a : b); //aとbの小さい方を表示 } } p.89 論理関係演算子・否定演算子 ・2つのbool値を返す式の間に置いて、bool値を返す演算 ・2項&&演算子:両方がtrueならtrueを、でければfalseを返す。論理積、「かつ」「AND」ともいう  例: (a > 0 && b > 0) ? "aもbも正の数" : "どちらかは正の数ではない" ・2項||演算子:両方がfalseならfalseを、でければtrueを返す。論理和、「または」「OR」ともいう  例: (a > 0 || b > 0) ? "aとbのどちらかまたは両方が正の数" : "どちらも正の数ではない" ・単項!演算子:値や式がtrueならfalseを、でければtrueを返す。否定、「NOT」ともいう  例: !(a > 0) ? "aは正の数じゃない" : "aは正の数" ・単項!演算子は複雑な条件式を反転したい場合に用いる  例: !(a > 0 && b > 0) ? "「aもbも正の数」ではない" : "aもbも正の数" ・単項!演算子は単純にbool型の変数値を反転したい場合にも便利 bool a = true, b = !a; p.89 ビット論理演算子 ・値を2進数表現にして、ビットごとに計算した結果によるビット列を返す ・2項&演算子:両方が1なら1を、でければ0を返す。 ・2項|演算子:両方が0なら0を、でければ1を返す。 ・2項^演算子:同じなら0を、でければ1を返す。別名:排他的論理和 ・単項~演算子:全ビットを反転した結果を返す。別名:(1の)補数 ミニ演習 mini090.cs ・int型の値を入力して「100 / 入力値」が50超かを表示するプログラムを作成しよう ・まず、短絡評価を用いないと0が入力されたときに、異常終了することを確認しよう ・それから、短絡評価を用いて0が入力されたときに、異常終了しないことを確認しよう 作成例 その1 短絡評価を用いないと0が入力されたときに、異常終了する //ミニ演習 mini090.cs using System; class mini090 { public static void Main() { Console.Write("100を何で割る? : "); //表示し改行しない int a = int.Parse(Console.ReadLine()); //コンソールから文字列を読み込んで整数化した値で初期化 Console.WriteLine((100 / a > 50) ? "50超です" : "50以下です"); //結果表示 } } 作成例 その2 短絡評価を用いて0が入力されたときに、異常終了しない //ミニ演習 mini090.cs using System; class mini090 { public static void Main() { Console.Write("100を何で割る? : "); //表示し改行しない int a = int.Parse(Console.ReadLine()); //コンソールから文字列を読み込んで整数化した値で初期化 Console.WriteLine((a != 0 && 100 / a > 50) ? "50超です" : "50以下か∞です"); //結果表示 } } p.90 bitwise01.cs //p.90 bitwise01.cs using System; class bitwise01 { public static void Main() { byte a = 2, b = 3; //2進数4桁にすると 2⇒0010 3⇒0011 Console.WriteLine(a & b); // 0010 & 0011 = 0010 となり10進数の2 Console.WriteLine(a | b); // 0010 | 0011 = 0011 となり10進数の3 Console.WriteLine(a ^ b); // 0010 ^ 0011 = 0001 となり10進数の1 Console.WriteLine(); //改行 bool x = true, y = false; //trueは2進数の1、falseは2進数の0 Console.WriteLine(x & x); //1 & 1 = 1 ⇒ True Console.WriteLine(x & y); //1 & 0 = 0 ⇒ False Console.WriteLine(y & y); //0 & 0 = 0 ⇒ False Console.WriteLine(); //改行 Console.WriteLine(x | x); //1 | 1 = 1 ⇒ True Console.WriteLine(x | y); //1 | 0 = 1 ⇒ True Console.WriteLine(y | y); //0 & 0 = 0 ⇒ False Console.WriteLine(); //改行 Console.WriteLine(x ^ x); //1 ^ 1 = 0 ⇒ False Console.WriteLine(x ^ y); //1 ^ 0 = 1 ⇒ True Console.WriteLine(y ^ y); //0 ^ 0 = 0 ⇒ False } } p.94 代入演算子(及び複合代入演算子) ・代入の「=」記号は、実は2項=演算子で、優先度が低いが用途のバリエーションは多い ・主に四則演算と代入の組み合わせで「● = ● 演算子 式や値」となる場合に、簡略記述に用いられるのが複合代入演算子で、「● 演算子= 式や値」とできる。 ・例:  x = x + 10; ⇒ x += 10 // xに10を足しこむ  y = y - 10; ⇒ y -= 10 // yから10を差し引く  z = z * 5; ⇒ z *= 5; // zを5倍にする  w = w / 5; ⇒ w /= 5; // wを1/5にする  m = m % 5; ⇒ m %= 5; // mを5で割った余りにする 応用例⇒ y %= 100; //yを下2桁にする(例:2024⇒24) p.97 演算子の優先順位 ・演算子の優先順位は丸暗記の必要はなく、優先順位が特殊な式ではカッコで優先度を明示すると良い ・なお、代入演算子、複合代入演算子が優先順位最下位であることは意識しておくと良い p.97 演算子の結合規則 ・同じ優先度の演算子が複数並ぶ場合、基本的には左から評価する。これを「左から右への結合」という  ※ C/C++では「左結合」という ・一部の演算子では「右から左への結合」があり、最も有名なのは代入演算子。  例: a = b = 5; //5をbに代入し、その評価値である5をaに代入(結果的にaとbに5を代入したことになる)   つまり「a = (b = 5);」と同じ意味。  ※ちなみに、初期化における「=」の多重使用(例:int a = b = 1;)は不可。  「int a = 1, b = 1;」とするか「int a = 1, b = a;」とすれば良い。  ※なお、2項=演算子の左辺には変数のみ記述可能なので「変数 = 変数 = 変数 = 変数 = 変数 = 変数 = 値や式;」という構文のみ可。 第5章 制御文 p.101 制御文とは ・C#のプログラムは3つの構造の組み合わせで記述する。それが「順次」「分岐」「繰返し」 ・例外的な状況に対応できるもう一つの制御が「ジャンプ」で、一部を除いて非推奨とされている ・この「分岐」「繰返し」「ジャンプ」を行うのが制御文 p.101 if文 ・条件分岐を行える構文でいくつかのパターンがある ・基本構文: if(条件文) { 条件文がtrueである時に実行する文 } ・条件文にはbool型の変数または式を記述できるので、主に、関係演算子(p.88)の文を用いることが多い ・例:  if(a > 0) {    Console.WriteLine("aは正の数です");  } ・条件文がtrueである時に実行する文が1文のみの場合、{}を省略できる  ※ 省略することを禁止するチームルールの場合もある ・通常、「{」の後と、「}」の前に改行を入れて、その間をインデント(字下げ)するので、Visual Studioに自動的に行う機能が入っている  ※ Visual Studioの既定では「{」の前にも改行を自動挿入するが、利用者が設定を変えることができる。 ・条件文がtrueである時に実行する文は複数記述できるが、{}は省略できないので注意  例: if (a > 0) b = 100; c = 200; ⇒ if (a > 0) {b = 100}; c = 200; と解釈される。 p.102(if-else構文) ・if文に「そうでなければ」を加える構文 ・基本構文: if(条件文) { 条件文がtrueである時に実行する文 } else { 条件文がfalseである時に実行する文 } ・例:  if(a > 0) {    Console.WriteLine("aは正の数");  }  else {    Console.WriteLine("aは負の数か0");  } ・条件文がtrue/falseである時に実行する文が1文のみの場合、{}を省略できる  ※ 省略することを禁止するチームルールの場合もある。特に片方だけ省略は避けた方が良い ・elseはifの1個につき1個のみ記述でき、ifのないelseはエラーになる ・条件文がfalseである時に実行する文も複数記述できるが、{}は省略できないので注意 ・なお、if-else構文によってなんらかの値を定めるような処理は条件演算子でも書ける ・例: Console.WriteLine((a > 0) ? "aは正の数": "aは負の数か0"); } p.102(if-else if構文) ・if文に「そうでなくて、もしも」を加える構文 ・基本構文:  if(条件文①) { 条件文①がtrueである時に実行する文 }  else if(条件文②) { 条件文①がfalseで条件文②がtrueである時に実行する文 } ・例: if(a > 0) { Console.WriteLine("aは正の数"); } else if(a < 0) { Console.WriteLine("aは負の数"); } ・else ifはifの1個につきいくつでも記述でき、ifのないelse ifはエラーになる ・よって、多分岐構文が可能 ・例:  if(a == 0) {    Console.WriteLine("aは0");  }  else if(a == 1) {    Console.WriteLine("aは1");  }  else if(a == 2) {    Console.WriteLine("aは2");  } ・最後のelse ifの後に、elseを書いて「上記のどれでもなければ」を加えることが出来る ・例:  if(a == 0) {    Console.WriteLine("aは0");  }  else if(a == 1) {    Console.WriteLine("aは1");  }  else if(a == 2) {    Console.WriteLine("aは2");  }  else {    Console.WriteLine("aは0でも1でも2でもない");  } アレンジ演習:p.104 if01.cs ・nの値を10固定ではなくて、コンソールから入力するようにしよう 作成例 //アレンジ演習: p.104 if01.cs using System; class if01 { public static void Main() { int n; //n = 10; Console.Write("n : "); n = int.Parse(Console.ReadLine()); //【変更】nを入力 if (n > 5) { //式「n > 5」の評価がtrueなら後続のブロック内を実行 Console.WriteLine("nは5より大きい"); } else { //falseなら後続のブロック内を実行 Console.WriteLine("nは5より大きくはない"); } } } アレンジ演習:p.104 if01.cs・その2 ・「nは5より大きくはない」ではなく、nの値が5の場合は「nは5」、5未満の場合は「nは5より小さい」と表示しよう ・つまり、3分岐構造にしよう 作成例 //アレンジ演習: p.104 if01.cs その2 using System; class if01 { public static void Main() { int n; //n = 10; Console.Write("n : "); n = int.Parse(Console.ReadLine()); //【変更】nを入力 if (n > 5) { //式「n > 5」の評価がtrueなら後続のブロック内を実行 Console.WriteLine("nは5より大きい"); } else if (n < 5) { //上記がfalseで式「n < 5」の評価がtrueなら後続のブロック内を実行 Console.WriteLine("nは5より小さい"); } else { //上記の両方がfalseなら後続のブロック内を実行 Console.WriteLine("nは5"); } } } 提出:アレンジ演習:p.104 if01.cs・その3 ・比較対象の値も5固定ではなくて、コンソールから入力するようにしよう 次回予告:p.105「if02.cs」から再開します