講義メモ

・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
    }
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です