講義メモ ・p.82「算術演算子:型が異なる整数型と実数型による算術演算のルール」から 提出フォロー:アレンジ演習:p.81 add01.cs 続き ・下記の組み合わせを2項+演算子に与えるとどうなるかも試そう。エラーにならない場合は結果の型を確認しよう  ①実数リテラルと文字リテラル  ②論理値リテラルと論理値リテラル  ③論理値リテラルと文字リテラル  ④文字列リテラルと論理値リテラル 作成例 //アレンジ演習:p.81 add01.cs 続き using System; class add01 { public static void Main() { Console.WriteLine(3 + 6); //加算で9 Console.WriteLine(3.0 + 6); //加算で9.0(表示は9) Console.WriteLine("3.5" + 6); //連結で"3.56" Console.WriteLine(3.5 + "6"); //連結で"3.56" Console.WriteLine(); //改行 Console.WriteLine("(3.0 + 6)の型は{0}", (3.0 + 6).GetType()); //Double Console.WriteLine("文字列3.5 + intの6の型は{0}", ("3.5" + 6).GetType()); //String Console.WriteLine("doubleの3.5 + 文字列6の型は{0}", (3.5 + "6").GetType()); //同 //【以下追加】 Console.WriteLine("整数3 + 文字'A' → {0}", 3 + 'A'); //加算で68(Aの文字コードは65) Console.WriteLine("型は{0}", (3 + 'A').GetType()); //Int32となる Console.WriteLine("文字'A' + 文字'B' → {0}", 'A' + 'B'); //加算で131(文字コードで計算) Console.WriteLine("型は{0}", ('A' + 'B').GetType()); //Int32となる Console.WriteLine("文字列\"AB\" + 文字'C' → {0}", "AB" + 'C'); //連結で"ABC" Console.WriteLine("型は{0}", ("AB" + 'C').GetType()); //Stringとなる //Console.WriteLine("整数10 + 論理値True → {0}", 10 + true); //(未定義)エラー //【以下さらに追加】 Console.WriteLine("実数3.1 + 文字'A' → {0}", 3.1 + 'A'); //①加算で68.1(Aの文字コードは65) Console.WriteLine("型は{0}", (3.1 + 'A').GetType()); //Doubleとなる //Console.WriteLine("論理値True + 論理値False → {0}", true + false); //②(未定義)エラー //Console.WriteLine("論理値True + 文字'A' → {0}", true + 'A'); //③(未定義)エラー Console.WriteLine("文字列\"AB\" + 論理値False → {0}", "AB" + false); //④連結で"ABFalse" Console.WriteLine("型は{0}", ("AB" + false).GetType()); //Stringとなる } } p.82 算術演算子:型が異なる整数型と実数型による算術演算のルール ・型が異なる整数型と実数型による算術演算では: ①どちらかがdoubleであればもう一方をdoubleにして計算 ②ではなく、どちらかがfloatであればもう一方をfloatにして計算 ③ではなく、どちらかがdecimalであればもう一方をdecimalにして計算  例: int + double ⇒ (double)int + double  例: float + ushort ⇒ float + (float)ushort ・型が異なる実数型と実数型による算術演算では: ①どちらかがdecimalで、もう一方がdouble/floatであればエラー ②ではなく、doubleとfloatであれば、doubleにして計算  例: decimal d = 0M; Console.WriteLine(d + 1.5F); //エラーになる ・型が異なる整数型と整数型による算術演算では: ①どちらかがulongで、もう一方が符号無し型(byte/ushort/uint)であればulongにして計算 ②どちらかがulongで、もう一方が符号有り型(sbyte/short/int)であればエラー  例: ulong d = 1UL; Console.WriteLine(d + -10); //エラーになる ③ではなく、どちらかがlongであればもう一方をlongにして計算 ④ではなく、どちらかがuintで、もう一方が符号有り型(sbyte/short/int)であれば両方をlongにして計算 ⑤ではなく、どちらかがuintで、もう一方が符号有り型(sbyte/short/int)であればuintにして計算 ⑥でなければ、両方をintにして計算 p.82 算術演算子:「-」演算子について ・テキストで「-」演算子はマイナス記号として使うとあるが不正確で、実際は単項-演算子として作用する ・単項-演算子:右辺の値の符号を反転した結果を返す ・よって「-10」は整数リテラル「10」の前に単項-演算子を記述した式で「マイナス10という値」ではない。 ・つまり「-ha」は変数hpの前に単項-演算子を記述した式で、hpの値を得て符号を反転した結果を返す式。 p.82 算術演算子:2項/演算子について ・2項/演算子は左辺と右辺が共に整数の場合は整数除算を行い、小数点以下を切り捨てた結果を返す ・なお、商が負の数の場合も小数点以下を切り捨てるので「結果からみて0に近い方の整数」となる。  例: 5 / 4 ⇒ 1.25 ⇒ 1 、 -5 / 4 ⇒ -1.25 ⇒ -1 ・整数除算では0で割るとその時点で異常終了する ・なお、「5 / 0」のように明示的に0で割ると文法エラーになる ・2項/演算子は左辺と右辺のどちらかまたは両方が実数の場合は実数除算を行い、型の範囲を超えた桁は切り捨てられる ・実数除算では0.0で割ると無限大(∞)になる。左辺が負の数は-∞になる。どちらも正常とみなされる。 アレンジ演習:p.83 division01.cs ・「10 / 0」が文法エラーになることを確認してコメントアウトしよう ・「int a = 0; Console.WriteLine(10 / a);」が異常終了することを確認してコメントアウトしよう ・「10 / 0.0」が∞に、「-10 / 0.0」が-∞になることを確認しよう 作成例 //アレンジ演習:p.83 division01.cs using System; class division01 { public static void Main() { Console.WriteLine("10 / 3 = {0}", 10 / 3); //3 Console.WriteLine("(10 / 3)の型は{0}", (10 / 3).GetType()); //Int32 Console.WriteLine("10 / 3.0 = {0}", 10 / 3.0); //3.33333 Console.WriteLine("(10 / 3.0)の型は{0}", (10 / 3.0).GetType()); //Double //【以下追加】 //10 / 0; //エラーになる //int a = 0; Console.WriteLine(10 / a); //異常終了する Console.WriteLine(" 10 / 0.0 = {0}", 10 / 0.0); //∞ Console.WriteLine("-10 / 0.0 = {0}", -10 / 0.0); //-∞ } } p.84 剰余演算子 ・2項%演算子であり「パーセンテージ(百分率)」の意味は全くない ・C/C++とは異なり、C#では実数除算による剰余にも対応している ・C#における剰余の定義は、左辺aを右辺bで割った商の整数部dを得て、aーb×dを剰余とする  例:7 % 3 ⇒ 7 / 3 が2.333…なので 7ー3×2=1 でこれが余り  例:13.53 % 2 ⇒ 13.53 / 2 が6.675なので 13.53ー2×6=1.53 でこれが余り  例:13.53 % 2.1 ⇒ 13.53 / 2.1 が6.442857なので 13.53ー2.1×6=0.93 でこれが余り ・0で割った余りを得ようとするとその時点で異常終了する ・なお、「5 % 0」のように明示的に0で割った剰余を求めると文法エラーになる ・0.0で割った余りは非数(NaN)になる。左辺が負の数の場合もNaNになる。どちらも正常とみなされる。  ※ NaNは「Not a Number」の略 アレンジ演習:p.83 mod01.cs ・「10 % 0」が文法エラーになることを確認してコメントアウトしよう ・「int a = 0; Console.WriteLine(10 % a);」が異常終了することを確認してコメントアウトしよう ・「10 % 0.0」「-10 % 0.0」がNaNになることを確認しよう 作成例 //アレンジ演習:p.83 mod01.cs using System; class mod01 { public static void Main() { Console.WriteLine("10 % 3 = {0}", 10 % 3); //1 Console.WriteLine("13.53 % 2 = {0}", 13.53 % 2); //1.53 Console.WriteLine("13.53 % 2.5 = {0}", 13.53 % 2.5); //1.03 //【以下追加】 // 10 % 0; //エラーになる //int a = 0; Console.WriteLine(10 % a); //異常終了する Console.WriteLine(" 10 % 0.0 = {0}", 10 % 0.0); //NaN Console.WriteLine("-10 % 0.0 = {0}", -10 % 0.0); //NaN } } p.85 インクリメント演算子・デクリメント演算子 ・式「a = a + 1;」は「変数aの値を得て1加算し、その結果を変数aに代入する」という意味。 ・つまり、変数aの値に1を足しこんだ結果になり、カウントアップに該当する。 ・この処理は頻出なので、専用の演算子と専用のルールが用意されている ・単項++演算子(インクリメント演算子):左辺または右辺の変数の値を得て1加算し、その結果を変数aに代入する。 ・よって「a = a + 1;」は「++a;」または「a++;」と記述できる。 ・「++a;」を前置インクリメント演算子、「a++;」を後置インクリメント演算子といい、単独で用いた場合の処理結果は同じになる。 ・前置と後置の違いは、式の評価のタイミングで:  「++a;」(前置)は、「前に+1し、+1した結果の値を評価とする」  「a++;」(後置)は、「現在の値を評価とし、後に+1する」 ・よって、下記のように使い分けると良い  int a = 1; Console.WriteLine(++a); //2(aは2になる)  int b = 1; Console.WriteLine(b++); //1(bは2になる) ・上記の「++」を「--」にしたのがデクリメント演算子で、カウントダウンに該当する。 アレンジ演習:p.86 increment01.cs ・デクリメントの場合も試そう 作成例 //p.86 increment01.cs using System; class increment01 { public static void Main() { int a = 10; Console.WriteLine(a++); //10を表示し、aは11になる Console.WriteLine(a); //11を表示 int b = 10; Console.WriteLine(++b); //11になり、11を表示する Console.WriteLine(b); //11を表示 //【以下追加】 a = 10; Console.WriteLine(a--); //10を表示し、aは9になる Console.WriteLine(a); //9を表示 b = 10; Console.WriteLine(--b); //9になり、9を表示する Console.WriteLine(b); //9を表示 } } p.87 インクリメント演算子・デクリメント演算子:int型以外の場合 ・インクリメント演算子・デクリメント演算子はint型以外の整数型、実数型、文字型でも有効 ・論理型、文字列型に行うとエラーになる アレンジ演習:p.86 increment01.cs ・int型以外の整数型の最大値をインクリメントした場合を試そう ・文字型、論理型、文字列型の値をインクリメントした場合を試そう 作成例 //p.87 increment02.cs using System; class increment02 { public static void Main() { double a = 1.25; decimal d = -12.3M; Console.WriteLine(++a); //2.25となり、2.25を表示 Console.WriteLine(--d); //-13.3Mとなり、-13.3を表示 //【以下追加】 byte b = byte.MaxValue; Console.WriteLine("++byte.MaxValue:{0}", ++b); //0(サイクリックする) sbyte sb = sbyte.MaxValue; Console.WriteLine("++sbyte.MaxValue:{0}", ++sb); //-128(同上) char c = 'A'; Console.WriteLine("++'A':{0}", ++c); //B(あれば次の文字になる) bool e = false; //Console.WriteLine("++false:{0}", ++e); //論理型のインクリメントはエラー string s = "ABC"; //Console.WriteLine("++\"ABC\":{0}", ++s); //文字列型のインクリメントはエラー } } p.88 関係演算子 ・関係演算子:2項演算子で左辺と右辺の値の比較結果を論理値で返す演算子で6種類ある ・型が異なる整数型と実数型による関係演算は、型が異なる整数型と実数型による算術演算の場合と同様  例:Console.WriteLine(5 == 5.0); //double型で等しいのでtrueになる ・2項==演算子:左辺と右辺の値が等しければtrueを、でなけばfalseを返す。2項!=演算子はその逆。  ※この2つを合わせて等価演算子ともいう ・2項>演算子、2項>=演算子、2項<演算子、2項<=演算子、:左辺が右辺超/以上/未満/以下であればtrueを、でなけばfalseを返す。 ・なお「==」「!=」「<=」「>=」は右側がイコールで間に空白がないことがルール ミニ演習 mini088.cs ・「アレンジ演習:p.81 add01.cs 続き」を用いて、型が異なる関係演算を試そう ⇒下記は文法エラーになる  文字列と整数の比較  文字列と文字の比較  整数と論理型の比較  論理型と文字の比較  文字列と論理型の比較 作成例 //ミニ演習 mini088.cs using System; class mini088 { public static void Main() { Console.WriteLine(3 == 6); //False Console.WriteLine(3.0 == 6); //False //Console.WriteLine("3.5" == 6); //文字列と整数の比較はエラー Console.WriteLine("(3.0 == 6)の型は{0}", (3.0 == 6).GetType()); //System.Boolean Console.WriteLine("整数3 == 文字'A' → {0}", 3 == 'A'); //False Console.WriteLine("文字'A' == 文字'B' → {0}", 'A' == 'B'); //False //Console.WriteLine("文字列\"AB\" + 文字'C' → {0}", "AB" == 'C'); //文字列と文字の比較はエラー //Console.WriteLine("整数10 == 論理値True → {0}", 10 == true); //整数と論理型の比較はエラー Console.WriteLine("実数3.1 == 文字'A' → {0}", 3.1 == 'A'); //False Console.WriteLine("論理値True == 論理値False → {0}", true == false); //False //Console.WriteLine("論理値True == 文字'A' → {0}", true == 'A'); //論理型と文字の比較はエラー //Console.WriteLine("文字列\"AB\" == 論理値False → {0}", "AB" == false); //文字列と論理型の比較はエラー } } p.88 条件演算子 ・唯一の3項演算子で、シンプルな分岐構造を提供する演算子 ・書式: bool型の式 ? 式がtrueの場合の値や式 : 式がfalseの場合の値や式 ・よって、bool型の式はtrueかfalseかによって、評価が変わるので条件式を書くことで条件に応じた結果にできる ・例: x = (a > b) ? a : b; //aがb超ならaを、でなければbをxに代入 ⇒ aとbの大きいほうをxに代入  ※ bool型の式は読みやすさを考えてカッコで囲むことが多い(チームルールの場合もある) ・例: x = (a > b) ? a - b : b - a; //aがb超ならa-bを、でなければb-aをxに代入 ⇒ aとbの差をxに代入 ミニ演習 mini088a.cs ・int型の2値をコンソールから読み込んで、大きいほうを表示するプログラムを条件演算子で書こう ・また2値の差も表示しよう ・もう一つint型の値をコンソールから読み込んで、最小値を表示しよう 作成例 //ミニ演習 mini088a.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); Console.WriteLine("差は{0}", (a > b) ? a - b : b - a); //差は大きいほう-小さいほう Console.Write("整数C : "); int c = int.Parse(Console.ReadLine()); int min = (a < b) ? a : b; //aとbの小さいほうをminに代入 Console.WriteLine("最小値は{0}", (c < min) ? c : min); //cとminの小さいほうが最小値 //【別解】 Console.WriteLine("最小値は{0}", (a < b) ? ((a < c) ? a : c) : ((b < c) ? b : c)); //上記2行を1行で } } p.89 論理関係演算子 ・2つのbool型の値による演算でbool型を得るのが論理関係演算で、論理積と論理和がある。 ・2項&&演算子:左辺と右辺が論理値の時に、その論理積をbool型で返す。  論理積とは、両方がtrueであればtrue、でなければfalse。  よって2条件の「かつ」を表すときに利用する  例: (a > b) && (a > c) //aがbより大、かつ、aがcより大ならtrueを返す、でなければfalseを返す  例: (a >= 20) && (a <= 60) //aが20以上、かつ、aが60以下ならtrueを返す、でなければfalseを返す。    つまり、aが20以上60以下ならtrueを返す。 ・2項||演算子:左辺と右辺が論理値の時に、その論理和をbool型で返す。  論理和とは、両方がfalseであればfalse、でなければtrue。  よって2条件の「または」を表すときに利用する  例: (a > b) || (a > c) //aがbより大、または、aがcより大ならtrueを返す、でなければfalseを返す  例: (a <= 20) || (a >= 60) //aが20以下、または、aが60以上ならtrueを返す、でなければfalseを返す。    つまり、aが20以下か60以上ならtrueを返す。 提出:「ミニ演習 mini088a.cs」 次回予告:p.89「論理関係演算子」の条件演算子を用いるミニ演習から