「演算子」の編集履歴(バックアップ)一覧に戻る

演算子 - (2008/12/28 (日) 01:55:40) のソース

演算子とは、演算を表す記号のことです。また演算が作用する対象をオペランドといいます。

&bold(){目次}
#contents()
*四則演算子など
2つのオペランドに対し、加算、減算などを行う演算子です。

#html2(){{{{{{
<TABLE border="1" cellspacing="0" cellpadding="2">
        <TBODY>
          <TR>
            <TD style="background-color:#ddeeff;" align="center">演算子</TD>
            <TD style="background-color:#ddeeff;" align="center">意味</TD>
            <TD style="background-color:#ddeeff;" align="center">例</TD>
            <TD style="background-color:#ddeeff;" align="center">答え</TD>
          </TR>
          <TR>
            <TD style="">+</TD>
            <TD style="">加算</TD>
            <TD style="">1 + 2;<BR>
            2147483647 + 1;<BR>
            2147483647u + 1;</TD>
            <TD style="">3<BR>
            - 2147483648 オーバーフロー<BR>
            2147483648</TD>
          </TR>
          <TR>
            <TD style="">-</TD>
            <TD style="">減算</TD>
            <TD style="">2 - 1;<BR>
            -2147483648 - 1;<BR>
            -2147483648L - 1;</TD>
            <TD style="">1<BR>
            2147483647 オーバーフロー<BR>
            -2147483649</TD>
          </TR>
          <TR>
            <TD style="">*</TD>
            <TD style="">乗算</TD>
            <TD style="">2 * 3:<BR>
            2147483647 * 2;<BR>
            2147483647u * 2;</TD>
            <TD style="">6<BR>
            - 2 オーバーフロー<BR>
            4294967294</TD>
          </TR>
          <TR>
            <TD style="">/</TD>
            <TD style="">除算</TD>
            <TD style="">2 / 1:<BR>
            3 / 2;<BR>
            3.0 / 2.0;</TD>
            <TD style="">2<BR>
            1 整数同士の割り算は整数<BR>
            1.5</TD>
          </TR>
          <TR>
            <TD style="">%</TD>
            <TD style="">剰余</TD>
            <TD style="">2 % 1;<BR>
            3 % 2;</TD>
            <TD style="">0<BR>
            1</TD>
          </TR>
        </TBODY>
      </TABLE>
}}}}}}

加算、減算、乗算では、計算結果が型の範囲(最大値,最小値)を超えた場合オーバーフローを起こします。オーバーフローを防ぐ場合、計算結果にあった型を指定し、計算をします。
除算では、整数同士の割り算の計算結果は整数となり、0に丸められます(正の場合は切り捨て、負の場合は切り上げ)。小数の計算結果を求める場合、浮動小数点同士で計算をします。
*単項演算子
1つのオペランドの前に使用する演算子を単項演算子といいます。

#html2(){{{{{{
 <TABLE border="1" cellspacing="0" cellpadding="2">
        <TBODY>
          <TR>
            <TD style="background-color:#ddeeff;" align="center">演算子</TD>
            <TD style="background-color:#ddeeff;" align="center">意味</TD>
            <TD style="background-color:#ddeeff;" align="center">例</TD>
            <TD style="background-color:#ddeeff;" align="center">答え</TD>
          </TR>
          <TR>
            <TD style="">+</TD>
            <TD style="">符号はそのまま</TD>
            <TD style="">+1<BR>
            +(-1)</TD>
            <TD style="">1<BR>
            -1</TD>
          </TR>
          <TR>
            <TD style="">-</TD>
            <TD style="">符号を反転</TD>
            <TD style="">-1<BR>
            -(-1)</TD>
            <TD style="">-1<BR>
            1</TD>
          </TR>
          <TR>
            <TD style="">!</TD>
            <TD style="">論理否定</TD>
            <TD style="">!true<BR>
            !false</TD>
            <TD style="">False<BR>
            True</TD>
          </TR>
          <TR>
            <TD style="">~</TD>
            <TD style="">ビットを反転<BR>
            (1の補数)</TD>
            <TD style="">~1<BR>
            ~1u</TD>
            <TD style="">-2<BR>
            4294967294</TD>
          </TR>
        </TBODY>
      </TABLE>
}}}}}}
*比較演算子
2つのオペランドを比較する演算子を比較演算子といいます。

#html2(){{{{{{
<TABLE border="1" cellspacing="0" cellpadding="2">
        <TBODY>
          <TR>
            <TD style="background-color:#ddeeff;" align="center">演算子</TD>
            <TD style="background-color:#ddeeff;" align="center">意味</TD>
            <TD style="background-color:#ddeeff;" align="center">例</TD>
            <TD style="background-color:#ddeeff;" align="center">答え</TD>
          </TR>
          <TR>
            <TD style="">< </TD>
            <TD style="">より小さい</TD>
            <TD style="">1 < 2<BR>
            2 < 1<BR>
            1 < 1</TD>
            <TD style="">True<BR>
            False<BR>
            False</TD>
          </TR>
          <TR>
            <TD style="">></TD>
            <TD style="">より大きい</TD>
            <TD style="">2 > 1<BR>
            1 > 2<BR>
            1 > 1</TD>
            <TD style="">True<BR>
            False<BR>
            False</TD>
          </TR>
          <TR>
            <TD style=""><=</TD>
            <TD style="">以下</TD>
            <TD style="">1 <= 2<BR>
            2 <= 1<BR>
            1 <= 1</TD>
            <TD style="">True<BR>
            False<BR>
            True</TD>
          </TR>
          <TR>
            <TD style="">>=</TD>
            <TD style="">以上</TD>
            <TD style="">2 >= 1<BR>
            1 >= 2<BR>
            1 >= 1</TD>
            <TD style="">True<BR>
            False<BR>
            True</TD>
          </TR>
          <TR>
            <TD style="">==</TD>
            <TD style="">等しい</TD>
            <TD style="">1 == 2<BR>
            2 == 1<BR>
            1 == 1</TD>
            <TD style="">False<BR>
            Flase<BR>
            True</TD>
          </TR>
          <TR>
            <TD style="">!=</TD>
            <TD style="">等しくない</TD>
            <TD style="">1 != 2<BR>
            2 != 1<BR>
            1 != 1</TD>
            <TD style="">True<BR>
            True<BR>
            False</TD>
          </TR>
        </TBODY>
      </TABLE>
}}}}}}
*論理演算子
論理演算を行い真偽を判定する演算子を論理演算子といいます。

#html2(){{{{{{
 <TABLE border="1" cellspacing="0" cellpadding="2">
        <TBODY>
          <TR>
            <TD style="background-color:#ddeeff;" align="center">演算子</TD>
            <TD style="background-color:#ddeeff;" align="center">意味</TD>
            <TD style="background-color:#ddeeff;" align="center">例</TD>
            <TD style="background-color:#ddeeff;" align="center">答え</TD>
          </TR>
          <TR>
            <TD style="">&</TD>
            <TD style="">論理積(AND)</TD>
            <TD style="">true & true<BR>
            true & false<BR>
            12 & 10</TD>
            <TD style="">True<BR>
            False<BR>
            8</TD>
          </TR>
          <TR>
            <TD style=""><SPAN style="color: black;">| </SPAN></TD>
            <TD style="">論理和(OR)</TD>
            <TD style="">true <SPAN style="color: black;">| </SPAN>true<BR>
            true <SPAN style="color: black;">| </SPAN>false<BR>
            12 <SPAN style="color: black;">| </SPAN>10</TD>
            <TD style="">True<BR>
            True<BR>
            14</TD>
          </TR>
          <TR>
            <TD style="">^</TD>
            <TD style="">排他的論理和(XOR)</TD>
            <TD style="">true ^ true<BR>
            true ^ false<BR>
            12 ^ 10</TD>
            <TD style="">False<BR>
            True<BR>
            6</TD>
          </TR>
          <TR>
            <TD style="">&&</TD>
            <TD style="">条件論理積(ショートサーキット)</TD>
            <TD style="">true & true<BR>
            true & false</TD>
            <TD style="">True<BR>
            False</TD>
          </TR>
          <TR>
            <TD style=""><SPAN style="color: black;">|| </SPAN></TD>
            <TD style="">条件論理和(ショートサーキット)</TD>
            <TD style="">true <SPAN style="color: black;">| </SPAN>true<BR>
            true <SPAN style="color: black;">| </SPAN>false</TD>
            <TD style="">True<BR>
            True</TD>
          </TR>
        </TBODY>
      </TABLE>
}}}}}}

& 、| 、^ 演算子はbool型、整数型に利用可能です。整数型に対して用いた場合、ビットごとの論理演算となります。
&& 、|| はbool型のみ利用可能です。& 、| と違い、左オペランドの評価で結果が得られる場合に右オペランドは評価しない(ショートサーキット)ため高速になります。
*インクリメント演算子、デクリメント演算子
オペランドの値に1加算する演算子をインクリメント演算子、1減算する演算子をデクリメント演算子といいます。

#html2(){{{{{{
 <TABLE border="1" cellspacing="0" cellpadding="2">
        <TBODY>
          <TR>
            <TD style="background-color:#ddeeff;" align="center">演算子</TD>
            <TD style="background-color:#ddeeff;" align="center">意味</TD>
            <TD style="background-color:#ddeeff;" align="center">例</TD>
            <TD style="background-color:#ddeeff;" align="center">答え</TD>
          </TR>
          <TR>
            <TD style="">++</TD>
            <TD style="">オペランドに1加算される</TD>
            <TD style="">int a = 0;<BR>
            Console.WriteLine(++a);<BR>
            Console.WriteLine(++a);<BR>
            Console.WriteLine(a);<BR>
            int b = 0;<BR>
            Console.WriteLine(b++);<BR>
            Console.WriteLine(b++);<BR>
            Console.WriteLine(b);</TD>
            <TD style=""><BR>
            1<BR>
            2<BR>
            2<BR>
            <BR>
            0<BR>
            1<BR>
            2</TD>
          </TR>
          <TR>
            <TD style="">--</TD>
            <TD style="">オペランドから1減算される</TD>
            <TD style="">int a = 0;<BR>
            Console.WriteLine(--a);<BR>
            Console.WriteLine(--a);<BR>
            Console.WriteLine(a);<BR>
            int b = 0;<BR>
            Console.WriteLine(b--);<BR>
            Console.WriteLine(b--);<BR>
            Console.WriteLine(b);</TD>
            <TD style=""><BR>
            -1<BR>
            -2<BR>
            -2<BR>
            <BR>
            0<BR>
            -1<BR>
            -2</TD>
          </TR>
        </TBODY>
      </TABLE>
}}}}}}

&color(black){++}演算子をオペランドの手前に書くと、オペランドの値を利用する前に1加算されます。オペランドの後方に書くと、オペランドの値を利用した後に1加算されます。
同様に、--演算子をオペランドの手前に書くと、オペランドの値を利用する前に1減算されます。オペランドの後方に書くと、オペランドの値を利用した後に1減算されます。
*シフト演算子
オペランドを指定ビット数だけ左、または右へシフトする演算子をシフト演算子といいます。

#html2(){{{{{{
 <TABLE border="1" cellspacing="0" cellpadding="2">
        <TBODY>
          <TR>
            <TD style="background-color:#ddeeff;" align="center">演算子</TD>
            <TD style="background-color:#ddeeff;" align="center">意味</TD>
            <TD style="background-color:#ddeeff;" align="center">例</TD>
            <TD style="background-color:#ddeeff;" align="center">答え</TD>
          </TR>
          <TR>
            <TD style=""><<</TD>
            <TD style="">左シフト</TD>
            <TD style="">15 << 1;</TD>
            <TD style="">30</TD>
          </TR>
          <TR>
            <TD style="">>></TD>
            <TD style="">右シフト</TD>
            <TD style="">15 >> 1;</TD>
            <TD style="">7</TD>
          </TR>
        </TBODY>
      </TABLE>
}}}}}}

右のオペランドで指定された数だけ左のオペランドが左、または右にシフトされます。
左のオペランドは int,uint,long,ulong、右のオペランドは int が指定可能です。
左シフトでは、左オペランドの上位ビットは破棄され、シフトの結果空になる下位ビットには 0 が入ります。
右シフトでは、左オペランドが int または long の場合、算術シフトとなります(シフトの結果空になる上位ビットに符号ビットが設定される)。左オペランドが uint 型または ulong 型の場合、論理シフトとなります(上位ビットには 0 が入る)。
*代入演算子
オペランドに値を代入する際用いられる演算子が代入演算子となります。

#html2(){{{{{{
<TABLE border="1" cellspacing="0" cellpadding="2">
        <TBODY>
          <TR>
            <TD style="background-color:#ddeeff;" align="center">演算子</TD>
            <TD style="background-color:#ddeeff;" align="center">意味</TD>
            <TD style="background-color:#ddeeff;" align="center">例</TD>
            <TD style="background-color:#ddeeff;" align="center">答え</TD>
          </TR>
          <TR>
            <TD style="">=</TD>
            <TD style="">代入</TD>
            <TD style="">int a = 1;</TD>
            <TD style="">1</TD>
          </TR>
          <TR>
            <TD style="">+=</TD>
            <TD style="">加算代入</TD>
            <TD style="">int a = 1;<BR>
            a += 2;</TD>
            <TD style=""><BR>
            3</TD>
          </TR>
          <TR>
            <TD style="">-=</TD>
            <TD style="">減算代入</TD>
            <TD style="">int a = 2;<BR>
            a -= 1;</TD>
            <TD style=""><BR>
            1</TD>
          </TR>
          <TR>
            <TD style="">*=</TD>
            <TD style="">乗算代入</TD>
            <TD style="">int a = 2;<BR>
            a *= 3;</TD>
            <TD style=""><BR>
            6</TD>
          </TR>
          <TR>
            <TD style="">/=</TD>
            <TD style="">除算代入</TD>
            <TD style="">int a = 6;<BR>
            a /= 3;</TD>
            <TD style=""><BR>
            2</TD>
          </TR>
          <TR>
            <TD style="">%=</TD>
            <TD style="">剰余代入</TD>
            <TD style="">int a = 3;<BR>
            a %= 2;</TD>
            <TD style=""><BR>
            1</TD>
          </TR>
          <TR>
            <TD style="">&=</TD>
            <TD style="">AND代入</TD>
            <TD style="">bool b = true;<BR>
            b &= false;</TD>
            <TD style=""><BR>
            False</TD>
          </TR>
          <TR>
            <TD style=""><SPAN style="color: black;">|= </SPAN></TD>
            <TD style="">OR代入</TD>
            <TD style="">bool b = true;<BR>
            b <SPAN style="color: black;">|= </SPAN>false;</TD>
            <TD style=""><BR>
            true</TD>
          </TR>
          <TR>
            <TD style="">^=</TD>
            <TD style="">排他的OR代入</TD>
            <TD style="">bool b = true;<BR>
            b ^= false;</TD>
            <TD style=""><BR>
            True</TD>
          </TR>
          <TR>
            <TD style=""><<=</TD>
            <TD style="">左シフト代入</TD>
            <TD style="">int a = 15;<BR>
            a <<= 1;</TD>
            <TD style=""><BR>
            30</TD>
          </TR>
          <TR>
            <TD style="">>>=</TD>
            <TD style="">右シフト代入</TD>
            <TD style="">int a = 15;<BR>
            a >>= 1;</TD>
            <TD style=""><BR>
            7</TD>
          </TR>
          <TR>
            <TD style="">??</TD>
            <TD style="">Null合体演算子</TD>
            <TD style="">int? a = null;<BR>
            int b = a ?? 1;</TD>
            <TD style=""><BR>
            1</TD>
          </TR>
        </TBODY>
      </TABLE>
}}}}}}

&color(black){+=}演算子の a += 2; は a = a + 2; と同じ意味になります。-=、*=、/=、%=、&=、|=、^=、<<=、>>= も同様です。
??演算子は、左オペランドがnullでない場合は左オペランドを返し、nullの場合は右オペランドを返します。
*条件演算子
条件の真偽に応じ、結果が変わる演算子を条件演算子と言います。

#html2(){{{{{{
<TABLE border="1" cellspacing="0" cellpadding="2">
        <TBODY>
          <TR>
            <TD style="background-color:#ddeeff;" align="center">演算子</TD>
            <TD style="background-color:#ddeeff;" align="center">意味</TD>
            <TD style="background-color:#ddeeff;" align="center">例</TD>
            <TD style="background-color:#ddeeff;" align="center">答え</TD>
          </TR>
          <TR>
            <TD style="">?:</TD>
            <TD style="">三項条件</TD>
            <TD style="">true ? 1 : 2;<BR>
            false ? 1 : 2;</TD>
            <TD style="">1<BR>
            2</TD>
          </TR>
        </TBODY>
      </TABLE>
}}}}}}

1番目のオペランドがtrueの場合、2番目のオペランドが結果となります。1番目のオペランドがfalseの場合、3番目のオペランドが結果となります。
*型情報演算子
オペランドの型、サイズを扱う演算子として以下があります。

#html2(){{{{{{
 <TABLE border="1" cellspacing="0" cellpadding="2">
        <TBODY>
          <TR>
            <TD style="background-color:#ddeeff;" align="center">演算子</TD>
            <TD style="background-color:#ddeeff;" align="center">意味</TD>
            <TD style="background-color:#ddeeff;" align="center">例</TD>
            <TD style="background-color:#ddeeff;" align="center">答え</TD>
          </TR>
          <TR>
            <TD style="">is</TD>
            <TD style="">データの型を検査する</TD>
            <TD style="">1 is int<BR>
            1.0 is int</TD>
            <TD style="">True<BR>
            False</TD>
          </TR>
          <TR>
            <TD style="">as</TD>
            <TD style="">データの型を変換する</TD>
            <TD style="">object obj = &quot;文字列&quot;;<BR>
            string str = obj as string;<BR>
            Console.WriteLine(str);<BR>
            object obj = 123;<BR>
            string str = obj as string;<BR>
            Console.WriteLine(str);</TD>
            <TD style=""><BR>
            <BR>
            文字列<BR>
            <BR>
            <BR>
            null</TD>
          </TR>
          <TR>
            <TD style="">sizeof</TD>
            <TD style="">値型のサイズ(バイト単位)を取得する</TD>
            <TD style="">int intSize = sizeof(int);<BR>
            int doubleSize = sizeof(double);</TD>
            <TD style="">4<BR>
            8</TD>
          </TR>
          <TR>
            <TD style="">typeof</TD>
            <TD style="">型のTypeを取得する</TD>
            <TD style="">System.Type shortType = typeof(short);<BR>
            System.Type intType = typeof(int);<BR>
            System.Type longType = typeof(long);</TD>
            <TD style="">System.Int16<BR>
            System.Int32<BR>
            System.Int64</TD>
          </TR>
        </TBODY>
      </TABLE>
}}}}}}

is演算子は、データが null 以外で、指定した型にキャスト可能な場合にTrueとなります。結果が必ずTrueまたはFalseの場合は、コンパイル時に警告が出力されます。
as演算子は、変換できない場合nullとなります。それに対し、キャストは変換できない場合例外が発生します。