講義メモ ・第4章「演算子」に進みます 第4章 演算子 p.79 式と演算子 ・「+」や「-」などの計算や操作を表す記号や単語を演算子という ・演算子の対象をオペランド(項)といい、演算子の種類によって用いる数が異なる  例:「a + b」はオペランドが2つなので「2項+演算子」という ・式を計算して結果を得ることを「評価する」という  例:2項+演算子の評価は加算結果になる ・代入の「=」も演算子であり、代入式は「2項=演算子」になっている ・2項=演算子の評価は代入値になる  例: c = 3 + 4 とすると「3 + 4」の評価である7がcに代入され、評価は7 ・演算子は基本的に左から評価されるが、「2項=演算子」のように右から評価するものもある アレンジ演習:expression01.cs ・式「a = 5 + 2」の評価も7になることを確認する処理を追加しよう 作成例 //アレンジ演習:p.80 expression01.cs using System; class expression01 { public static void Main() { int a = 0; //整数型変数aの初期化(宣言と初期値の代入) Console.WriteLine("a = {0}", a); //aの値を表示 Console.WriteLine("(a = 7)の値は{0}", a = 7); //式「a = 7」の評価(7)を表示 Console.WriteLine("(a = 5 + 2)の値は{0}", a = 5 + 2); //【追加】式「a = 5 + 2」の評価(7)を表示 } } p.81 算術演算子(+,-,*,/) ・2項+演算子:2項が共に数値型であれば加算結果を返す。どちらかでも文字列ならば連結結果を返す ・2項-演算子:2項が共に数値型であれば左辺から右辺を引いた結果を返す。 ・2項*演算子:2項が共に数値型であれば左辺と右辺の積を返す。 ・2項/演算子:2項が共に整数型であれば左辺を右辺で割った商の整数部を返す(小数点以下切り捨て)。どちらかでも実数型ならば商を返す。  ※ 右辺の値が0だと実行時エラー、右辺が「0」だと文法エラーになる  ※ 右辺が0.0だと∞、-0.0だと-∞になる。 ・ちなみに、2項+演算子のように用いる値の型により動作が異なるころをオーバーロードという(詳細は14章参照) アレンジ演習: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); //6が文字列に変換されて結合され3.56 Console.WriteLine(3.5 + "6"); //3.5が文字列に変換されて結合され3.56 Console.WriteLine(); //改行 Console.WriteLine("(3.0 + 6)の型は{0}",(3.0 + 6).GetType()); //double = System.Double Console.WriteLine("文字列3.5 + intの6の型は{0}",("3.5" + 6).GetType()); //string = System.String Console.WriteLine("doubleの3.5 + 文字列6の型は{0}", (3.5 + "6").GetType()); //同上 //【以下追加】 Console.WriteLine("整数リテラル + 文字リテラルの型は{0}", (5 + 'A').GetType()); //int = System.Int32 Console.WriteLine("5 + 'A' は {0}", 5 + 'A'); //70(文字'A'の文字コード65を加算 Console.WriteLine("文字リテラル + 文字列リテラルの型は{0}", ('A' + "BC").GetType());//string = System.String Console.WriteLine("'A' + \"BC\" は {0}", 'A' + "BC"); //"ABC"('A'が文字列"A"に変換されて結合 // Console.WriteLine("整数リテラルと論理値リテラルの型は{0}", (5 + true).GetType());//エラー } } p.82(型が異なる整数型と実数型による算術演算のルール) ① どちらがdoubleであれば、両方をdoubleに変換して計算 ② ではなくて、どちらがfloatであれば、両方をfloatに変換して計算 ③ ではなければどちらも整数なので、ulong、long、uint、intの順にあてはめて変換して計算 ※ decimal型は実数変換できないので、対象外。 アレンジ演習:p.83 division01.cs ・下記の組み合わせを、2項/演算子に渡すと、どうなるか確認しよう。可能な場合、結果の型はどうなるか確認しよう。 ①整数リテラル / 0 ②整数リテラル / 値が0である変数 ③整数リテラル / 0.0 ④整数リテラル / -0.0 ⑤実数リテラル / 0 ⑥実数リテラル / 値が0である変数 ⑦実数リテラル / 0.0 ⑧実数リテラル / -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()); //int(System.Int32) Console.WriteLine("10 / 3.0 = {0}", 10 / 3.0); //3.333333333333333 Console.WriteLine("(10 / 3.0)の型は{0}", (10 / 3.0).GetType()); //double(System.Double) //【以下追加】 // Console.WriteLine("10 / 0 = {0}", 10 / 0); //文法エラー int w = 0; //値が0である整数型変数 // Console.WriteLine("10 / w = {0}", 10 / w); //実行時エラー「0 で除算しようとしました」 Console.WriteLine("10 / 0.0 = {0}", 10 / 0.0); //∞ Console.WriteLine("(10 / 0.0)の型は{0}", (10 / 0.0).GetType()); //double(System.Double) Console.WriteLine("10 / -0.0 = {0}", 10 / -0.0); //-∞ Console.WriteLine("(10 / -0.0)の型は{0}", (10 / 0.0).GetType()); //double(System.Double) Console.WriteLine("10.0 / 0 = {0}", 10 / 0.0); //∞ Console.WriteLine("(10 / 0.0)の型は{0}", (10 / 0.0).GetType()); //double(System.Double) Console.WriteLine("10.0 / w = {0}", 10.0 / w); //∞ Console.WriteLine("(10.0 / w)の型は{0}", (10.0 / w).GetType()); //double(System.Double) Console.WriteLine("10.0 / 0.0 = {0}", 10.0 / 0.0); //∞ Console.WriteLine("(10.0 / 0.0)の型は{0}", (10.0 / 0.0).GetType()); //double(System.Double) Console.WriteLine("10.0 / -0.0 = {0}", 10.0 / -0.0); //-∞ Console.WriteLine("(10.0 / -0.0)の型は{0}", (10.0 / -0.0).GetType()); //double(System.Double) } } p.84 剰余演算子 ・2項%演算子:2項が共に数値型であれば左辺を右辺で割った余りを返す(パーセンテージではない)  例: 9 % 2 ⇒ 1 (9÷2=4あまり1だから)  例: 1 % 0.3 ⇒ 0.1 (1÷0.3=3あまり0.1だから) a・なお、負の数の場合、C#のルールにしたがって計算されるので注意  ⇒ 双方を正の数にして剰余を得てから、左辺の符号を付けている Console.WriteLine(" 10 % -3 = {0}", 10 % -3); // 10÷-3=-3余り 1となる Console.WriteLine("-10 % 3 = {0}", -10 % 3); //-10÷ 3=-3余り-1となる Console.WriteLine("-10 % -3 = {0}", -10 % -3); //-10÷-3= 3余り-1となる ・補足:負の数の剰余算を推奨しない場合もある アレンジ演習:p.84 mod01.cs ・下記の組み合わせを、2項/演算子に渡すと、どうなるか確認しよう。可能な場合、結果の型はどうなるか確認しよう。 ①整数リテラル % 0 ②整数リテラル % 値が0である変数 ③整数リテラル % 0.0 ④整数リテラル % 0.0以外の実数リテラル 作成例 //p.84 mod01.cs using System; class mod01 { public static void Main() { Console.WriteLine("10 % 3 = {0}", 10 % 3); //1(10÷3は3余り1なので) Console.WriteLine("13.53 % 2 = {0}", 13.53 % 2); //1.53(13.53÷2は6余り1.53なので) Console.WriteLine("13.53 % 2.5 = {0}", 13.53 % 2.5); //1.03(13.53÷2.5は5余り1.03なので) //【以下追加】 //Console.WriteLine("10 % 3 = {0}", 10 % 0); //文法エラー int w = 0; //Console.WriteLine("10 % w = {0}", 10 % w); //実行時エラー「0 で除算しようとしました」 Console.WriteLine("10 % 0.0 = {0}", 10 % 0.0); //NaN(非数) Console.WriteLine("(10 % 0.0)の型は{0}", (10 % 0.0).GetType()); //double(System.Double) Console.WriteLine("10 % 0.3 = {0}", 10 % 0.3); //0.1(10÷0.3は3余り0.1なので) Console.WriteLine("(10 % 0.3)の型は{0}", (10 % 0.3).GetType()); //double(System.Double) } } p.85 インクリメント演算子、デクリメント演算子 ・単項++演算子:「変数 = 変数 + 1」を「変数++」または「++変数」と記述でき、インクリメント演算子ともいう。 ・「++変数」を前置インクリメント演算子、「変数++」を後置インクリメント演算子という ・前置と後置は単独で行う場合は同じ意味だが、評価のタイミングが異なる ・前置の場合:1を足しこんで、その結果を評価とする ・後置の場合:現在の値を評価としてから、1を足しこむ ・例: int i = 10; Console.Write(++i); Console.Write(i); //11 11となる ・例: int i = 10; Console.Write(i++); Console.Write(i); //10 11となる ・C#では実数型変数にも利用可能で、1.0が加算される ・単項--演算子:「変数 = 変数 - 1」を「変数--」または「--変数」と記述でき、デクリメント演算子ともいう。動作は「++」と同様 アレンジ演習:p.86 increment01.cs ・「a++ + 10」と「++b + 10」がどうなるかも確認しよう 作成例 //アレンジ演習:p.86 increment01.cs using System; class increment01 { public static void Main() { int a = 10; Console.WriteLine(a++); //aの値を表示(10)してから+1してaは11になる Console.WriteLine(a); //aの値は11になっている(11) //【以下追加】 Console.WriteLine(a++ + 10); //aは11なのでa+10の21を表示してから+1してaは12になる Console.WriteLine(a); //aの値は12になっている(12) int b = 10; Console.WriteLine(++b); //bに+1してbは11になり、それから表示(11) Console.WriteLine(b); //bの値は11になっている(11) //【以下追加】 Console.WriteLine(++b + 10); //bに+1してbは12になり、それから+10して表示(22) Console.WriteLine(b); //bの値は12になっている(12) } } アレンジ演習:p.87 increment02.cs ・char型変数、string型変数、bool型変数をインクリメント、デクリメントできるかも確認しよう 作成例 //アレンジ演習:p.87 increment02.cs using System; class increment02 { public static void Main() { double a = 1.25; decimal d = -12.3M; Console.WriteLine(++a); //double型の1.0を加算し2.25 Console.WriteLine(--d); //decimal型の-1.0Mを加算し-13.3Mになり、表示は-13.3 //【以下追加】 char c = 'a'; Console.WriteLine(++c); //'b'(文字コードで次の文字になる) string s = "ABC"; //Console.WriteLine(++s); //文法エラー bool b = true; //Console.WriteLine(++b); //文法エラー } } p.88 関係演算子 ・値の大小関係によりbool型(p.57)の戻り値を返す演算子の総称 ・2項==演算子:左辺と右辺の値が等しければtrue、でなければfalse  ※「= =」はNG(途中に空白は不可) ・2項!=演算子:左辺と右辺の値が等しければfalse、でなければtrue  ※「! =」はNG(途中に空白は不可)逆の「=!」はNG ・2項>=演算子:左辺の値が右辺の値以上ならばtrue、でなければfalse  ※「> =」はNG(途中に空白は不可)逆の「=>」はNG ・2項<=演算子:左辺の値が右辺の値以下ならばtrue、でなければfalse  ※「< =」はNG(途中に空白は不可)逆の「=<」はNG ミニ演習 mini088a.cs ・bool型の変数aに式「10 == 8 + 2」の評価を初期値として与えて、表示してみよう ・bool型の変数bに式「1 + 3 != 4」の評価を初期値として与えて、表示してみよう 作成例 //ミニ演習 mini088a.cs using System; class mini088a { public static void Main() { bool a = (10 == 8 + 2); //関係演算式の評価を初期値として与える Console.WriteLine(a); //True bool b = (1 + 3 != 4); //関係演算式の評価を初期値として与える Console.WriteLine(b); //False } } p.88 条件演算子 ・C#では唯一の3項演算子で、制御構造を演算子で実装できる ・書式: bool型の式 ? 式がTrueの場合の値や式 : 式がfalseの場合の値や式 ・「:」の前後のどちらかだけが実行されるので「もしも●なら▲をでなければ■を」という構文になる 例: Concole.WriteLine(a > 0 ? "正の数" : "正の数ではない"); 例: int max = (a > b) ? a : b; //aとbの大きい方をmaxに代入 ・つまり、分岐構造を演算子で表現したもの ・一般に誤読防止の為にbool型の式をカッコで囲むことが多い ・なお、bool型の式は変数でも良い 例:  bool x = a > b; //xにはa>bならtrue、でなければfalseが入る  int max = (x) ? a : b; //xにより、どちらが大きいか分かるので、大きい方をmaxに代入 ・ただし「:」以降は省略不可なので「でなければ●を返す」が必須なので注意。 ミニ演習 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()); int max = (a > b) ? a : b; //aとbの大きい方をmaxに代入 Console.WriteLine("大きい方は{0}", max); } } 提出:ミニ演習 mini088b.cs・改造 ・コンソールから2つの整数を入力して変数aとbに代入し(p.46参照)、小さい方を表示しよう 次回予告:p.89「論理演算子」から