header

■演算子1

C#の演算子についてまとめます。
ほとんどがC++等でお馴染みのものです。
説明のため、左辺値をL、右辺値をR、として表記します。

算術演算子
↓は計算に用いる算術演算子の一覧です。
算術演算子意味
L + R加算:LとRを加算
L - R減算:LからRを減算
L * R乗算:LをR倍する
L / R除算:LをRで割る
L % R剰余:LをRで割った余り
L ++インクリメント:Lに1つ加算
L --デクリメント:Lから1つ減算
【例】

    static void Main(string[] args)
    {
        int L = 5;
        int R = 2;
        
        // 四則演算と剰余
        Console.WriteLine( "L + R = {0}", L + R );
        Console.WriteLine( "L - R = {0}", L - R );
        Console.WriteLine( "L * R = {0}", L * R );
        Console.WriteLine( "L / R = {0}", L / R );
        Console.WriteLine( "L % R = {0}", L % R );

        // インクリメント
        L ++;
        Console.WriteLine( "L ++ = {0}",  L );

        // デクリメント
        L --;
        Console.WriteLine( "L -- = {0}",  L );
    }

【実行結果】

    L + R = 7
    L - R = 3
    L * R = 10
    L / R = 2
    L % R = 1
    L ++ = 6
    L -- = 5

【補足】 インクリメント、デクリメントの++演算子、--演算子は 変数の右辺または左辺、どちらに記述しても構いません。 ↓のコードはどちらも文法的には正しいものです。 ++ 変数名; 変数名 ++; しかし、 前者の場合は、変数がインクリメントされた結果が評価され 後者の場合は、変数が評価された後にインクリメントされるため 式単体ではなく、if文内や引数といった場所での利用には注意が必要です。 具体的には、先ほどの例のコードのインクリメント部分を // インクリメント Console.WriteLine( "L ++ = {0}", L ++ ); のようにしてしまうと、変数Lの値が出力された後に 変数Lの値がインクリメントされるので 意図した結果とは異なる値が出力されてしまいます。 変数Lの値がインクリメントされた結果を出力したい場合は // インクリメント Console.WriteLine( "L ++ = {0}", ++ L ); とします。 コードの左側から順に処理、評価されると覚えると良いです。
関係演算子
↓は後で説明するif文や、for文などで使われる関係演算子です。 関係、とゆう言葉の通り、左辺と右辺、2つの値の関係を表すものです。
関係演算子意味
L == RLとRが等しい
L != RLとRが等しくない
L < RLがRより小さい
L <= RLがR以下
L > RLがRより大きい
L >= RLがR以上
【例】

    static void Main(string[] args)
    {
        int L = 5;
        int R = 2;

        if ( L == R ) Console.WriteLine( "LとRが等しい" );
        if ( L != R ) Console.WriteLine( "LとRが等しくない" );
        if ( L < R )  Console.WriteLine( "LがRより小さい" );
        if ( L <= R ) Console.WriteLine( "LがR以下" );
        if ( L > R )  Console.WriteLine( "LがRより大きい" );
        if ( L >= R ) Console.WriteLine( "LがR以上" );
    }

【実行結果】

    LとRが等しくない
    LがRより大きい
    LがR以上

論理演算子
↓は論理演算子です。 真偽値(真ならTrue、偽ならFalse)を返します。 論理演算子の場合、左辺値のL、右辺値のRのオペランドはbool型となります。 C#の型については別途説明しますが bool型とは真:true または 偽:falseのいずれかの値を格納する型です。
論理演算子意味
L & RLとRの論理積(AND)
L | RLとRの論理和(OR)
L ^ RLとRの排他的論理和(XOR)
!RRの否定(NOT)
L && RLとRの論理積(ショートサーキット評価)
L || RLとRの論理和(ショートサーキット評価)
【例】

    static void Main(string[] args)
    {
        bool L = true;
        bool R = false;

        if ( L & R )  Console.WriteLine( "LとRの論理積(AND)      結果=TRUE" );
        if ( L | R )  Console.WriteLine( "LとRの論理和(OR)       結果=TRUE" );
        if ( L ^ R )  Console.WriteLine( "LとRの排他的論理和(XOR)結果=TRUE" );
        if ( !R )     Console.WriteLine( "Rの否定(NOT)           結果=TRUE" );

        // 連続使用も可能です。
        bool C = true;
        if ( L & R & C ) Console.WriteLine( "LとRとCの論理積(AND)結果=TRUE" );
    }

【実行結果】

    LとRの論理和(OR)       結果=TRUE
    LとRの排他的論理和(XOR)結果=TRUE
    Rの否定(NOT)           結果=TRUE

【補足】 [ショートサーキット評価]について。 C#では ショートサーキット評価を行う論理積演算子と ショートサーキット評価を行う論理和演算子 の2つの短絡系の論理演算子が用意されています。 通常の論理積演算子、論理和演算子との違いは 例えば次のような条件があるとき A & B & C A、B、Cの3つのオペランドは常にすべて評価されますが これをショートサーキット評価を行うように次のように変更すると A && B && C オペランドAが偽の時、オペランドB以降の評価が行われません。 また、オペランドAが真であっても、オペランドBが偽の場合 オペランドCの評価は行われません。 これを利用して、行う必要のない無駄な評価を省くことが可能です。 以下は、割り算を行うコード例ですが ショートサーキット評価を使って ゼロでの除算を避けることが可能です。

    static void Main(string[] args)
    {
        int L = 10;
        int R = 2;

        if ( R > 0 && L / R >= 5 ) Console.WriteLine( "L / R >= 5 です。" );
    }

ビット演算子
ビット単位の演算子です。 注意点として、ビット演算子は整数型にのみ利用可能です。 bool型(真偽値)やdouble型など(少数を扱うもの)では使えません。
ビット演算子意味
L & RLとRのビットごとの論理積(AND)
L | RLとRのビットごとの論理和(OR)
L ^ RLとRのビットごとの排他的論理和(XOR)
L >> ビット数Lを右にビット数分シフト
L << ビット数Lを左にビット数分シフト
^ RRの1の補数(全ビットの逆転)
【例】

    static void Main(string[] args)
    {
        byte L = 6; // 2進数では 00000110
        byte R = 5; // 2進数では 00000101

        Console.WriteLine( "LとRのビットごとの論理積(AND)      {0}", L & R    );
        Console.WriteLine( "LとRのビットごとの論理和(OR)       {0}", L | R    );
        Console.WriteLine( "LとRのビットごとの排他的論理和(XOR){0}", L ^ R    );
        Console.WriteLine( "Lを右に1ビット分シフト               {0}", L >> 1   );
        Console.WriteLine( "Lを左に1ビット分シフト               {0}", L << 1   );
        Console.WriteLine( "Rの1の補数(全ビットの逆転)        {0}", (byte)~R );
    }

【実行結果】

    LとRのビットごとの論理積(AND)      4
    LとRのビットごとの論理和(OR)       7
    LとRのビットごとの排他的論理和(XOR)3
    Lを右に1ビット分シフト               3
    Lを左に1ビット分シフト               12
    Rの1の補数(全ビットの逆転)        250

以上で演算子についての説明を終わりますが サンプルプログラムを変更して動きの違いを見てみたり 色々工夫してみてください。




Copyright © 2008.07 - shougo suzaki