■演算子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 == R | LとRが等しい |
L != R | LとRが等しくない |
L < R | LがRより小さい |
L <= R | LがR以下 |
L > R | LがRより大きい |
L >= R | Lが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 & R | LとRの論理積(AND) |
L | R | LとRの論理和(OR) |
L ^ R | LとRの排他的論理和(XOR) |
!R | Rの否定(NOT) |
L && R | LとRの論理積(ショートサーキット評価) |
L || R | Lと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 & R | LとRのビットごとの論理積(AND) |
L | R | LとRのビットごとの論理和(OR) |
L ^ R | LとRのビットごとの排他的論理和(XOR) |
L >> ビット数 | Lを右にビット数分シフト |
L << ビット数 | Lを左にビット数分シフト |
^ R | Rの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
|