+、-、×、÷のように、 いくつかの変数に対して何らかの処理を加えるもののことを演算子(operator)と呼びます。 また、演算の対象となるもの(x+y の x や y)のことをオペランド(operand: 被演算子)と呼びます。
-x のように、1つのオペランドを必要とする演算子のことを単項演算子(unary operator)、 x+y のように、2つのオペランドを必要とする演算子のことを2項演算子(binary operator)と呼びます。 また、2項演算において、 演算子の左側にあるオペランドのことを左オペランド(left hand side operand)、 演算子の右側にあるオペランドのことを右オペランド(right hand side operand)といいます。
C# では、算術演算や論理演算を行うための演算子が用意されています。
+, -, *, / を用いて加減乗除算を行えます。
また、+, - を用いて数値の符号を反転することが出来ます。
整数型の除算はあまり切り捨てとなります。剰余を求めたい場合は % 演算子を用います。
これらの算術演算子はすべての数値型に対して利用できます。
| 演算子 | 意味 | 例 |
|---|---|---|
x + y | x と y を足す | byte a = 11 + 92; // a は 103 になる。 |
x - y | x から y を引く | int a = 9 - 4; // a は 5 になる。 |
x * y | x と y を掛ける | int a = 3 * 7; // a は 21 になる。 |
x / y | x を y で割る | int a = 9 / 2; // 整数の場合、あまり切り捨て。 a は 4 になる。double x = 9.0 / 2.0; // a は 4.5 になる。 |
x % y | x を y で割った余り | int a = 9 / 2; // a は 1 になる。 |
+x | x の値そのまま | int a = +1; // a = 1 と同じ |
-x | 符号反転 | int a = 1; |
注意1:
整数の除算 x / y は、0 に向かって丸められます。
すなわち、x / y の結果が正の場合は切捨て、
負の場合は切上げになります。
注意2:
剰余演算 x % y は、
整数の場合は x - (x / y) * y、
浮動小数点数の場合は x - Math.Floor(x / y) * y と同じ値になります。
++, -- を用いてインクリメント、デクリメント演算を行うことが出来ます。
インクリメント演算を行うとオペランドは 1 ずつ増加し、
デクリメント演算を行うとオペランドは 1 ずつ減少します。
インクリメント・デクリメント演算には前置き(++xという形式)と後置き(x++という形式)があります。
前置き演算の演算結果は、インクリメント・デクリメントが行われた後のオペランドの値になり、
後置き演算の演算結果は、インクリメント・デクリメントが行われる前のオペランドの値になります。
これらの算術演算子はすべての数値型に対して利用できます。
| 演算子 | 意味 | 例 |
|---|---|---|
++x | 前置きインクリメント | int a = 5;int b = ++a; // a も b も 6 になる。 |
x++ | 後置きインクリメント | int a = 5;int b = a++; // a は 6 に、b は 5 になる。 |
--x | 前置きデクリメント | int a = 5;int b = --a; // a も b も 4 になる。 |
x-- | 後置きデクリメント | int a = 5;int b = a--; // a は 4 に、b は 5 になる。 |
<< は左シフトを、
>> は右シフトを行う演算子です。
シフト演算子は左側のオペランドを右側のオペランド分だけ左または右にシフトします。
左オペランドには int, uint, long, ulong のみを、
右オペランドには int のみを取ることが出来ます。
左オペランドが符号付き整数の場合、右シフトは算術シフト演算になり、 符号無し整数の場合、右シフトは論理シフト演算になります。
| 演算子 | 意味 | 例 |
|---|---|---|
x<<i | 左シフト | int a = 51 << 2 ; // a は 204 になる。(0011 0011 << 2 = 1100 1100) |
x>>i | 右シフト | int a = 51 >> 1 ; // a は 25 になる。(0011 0011 >> 1 = 0001 1001) |
文字列に対して + 演算子を用いることで文字列の連結を行えます。
| 演算子 | 意味 | 例 |
|---|---|---|
x+y | 文字列連結 | string s = "abc" + "def"; // s は "abcdef" になる。 |
AND, OR, XOR などの論理演算を行います。
&, |, ^ はそれぞれ AND, OR, XOR を行う演算子です。
これらの演算子は整数型および bool 型に対して利用できます。
整数型に対してこれらの演算子を用いた場合、ビットごとの論理演算を行います。
! は論理否定を行う演算子です。
この演算子は bool 型に対してのみ利用できます。
~ はビットごとの補数演算(各ビットの 0/1 を反転する)を行う演算子です。
この演算子は int, uint, long, ulong に対してのみ利用できます。
&&, || は条件 AND, OR 演算子で、
その演算結果は bool に対する &, | の演算結果と同じものになります。
&& 演算子は、左オペランドが false の場合、右オペランドは評価されません。
同様に、|| 演算子は、左オペランドが true の場合、右オペランドは評価されません。
この演算子は bool 型に対してのみ利用できます。
| 演算子 | 意味 | 例 |
|---|---|---|
x & y | x と y の論理積を計算 | byte a = true & false; // a は false になる。byte a = 201 & 92; // a は 72になる。(1100 1001 AND 0101 1100 = 0100 1000) |
x | y | x と y の論理和を計算 | byte a = true | false; // a は true になる。byte a = 201 | 92; // a は 221になる。(1100 1001 OR 0101 1100 = 1101 1101) |
x ^ y | x と y の排他的論理和を計算 | byte a = true ^ true; // a は falseになる。byte a = 201 ^ 92; // a は 149になる。(1100 1001 XOR 0101 1100 = 1001 0101) |
!x | x の論理否定を計算 | bool a = !true; // a は false になる。 |
~x | x の補数を計算 | int a = ~201; // a は -202 になる。~(0000 0000 1100 1001) = 1111 1111 0011 0110 |
==, != を用いてオペランドの等値性を判断できます。
== は2つのオペランドが等しければ true を、
!= は2つのオペランドが等しくなければ true を返します。
これらの演算子はすべての組込み型に対して利用でき、
数値型の場合はその値の比較、文字列型の場合はすべての文字が一致しているかどうか、
オブジェクト型の場合はオブジェクトの参照先が同じかどうかを調べます。
<, >, <=, >= はオペランドの大小比較を行います。
これらの演算子は数値型に対して利用できます。
| 演算子 | 意味 | 例 |
|---|---|---|
x == y | x が y と等しいかどうか | bool a = "abc" == "abc"; // a は true になる。bool a = 1 == 0; // a は false になる。 |
x != y | x が y と異なるかどうか | bool a = "abc" != "abc"; // a は false になる。bool a = 1 != 0; // a は true になる。 |
x < y | x が y より小さいかどうか | bool a = 1 < 2; // a は true になる。bool a = 1 < 1; // a は false になる。bool a = 1 < 0; // a は false になる。 |
x > y | x が y より大さいかどうか | bool a = 1 > 2; // a は false になる。bool a = 1 > 1; // a は false になる。bool a = 1 > 0; // a は true になる。 |
x <= y | x が y 以下かどうか | bool a = 1 <= 2; // a は true になる。bool a = 1 <= 1; // a は true になる。bool a = 1 <= 0; // a は false になる。 |
x >= y | x が y 以上かどうか | bool a = 1 >= 2; // a は false になる。bool a = 1 >= 1; // a は true になる。bool a = 1 >= 0; // a は true になる。 |
=, +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>= を用いて代入を行えます。
= では、右オペランドの値を左オペランドに代入します。
a += b; は a = a + b; と同じ意味になります。
-=, *=, /=, %=, &=, |=, ^=, <<=, >>= も同様です。
これらの演算子はすべての型に対して用いることが出来ますが、 左右のオペランドの型は一致している必要があります。
| 演算子 | 意味 | 例 |
|---|---|---|
x = y | x に y を代入します | int a = 5; // a は 5 になる。 |
x += y | x = x + y と同じ結果が得られる | int a = 5;a += 10; // a は 15 になる。 |
?: 演算子は3項演算子(trinary operator)で、
1つ目のオペランドの結果に応じて2つ目か3つ目のどちらかのオペランドの値を返します。
(3項演算子、すなわち、オペランドを3つ取る演算子はこの条件演算子のみです。)
例えば、cond ? x : y; は
cond が true ならば x を、
cond が false ならば y を返します。
1つ目のオペランドは bool 型でなければなりません。
また、2つ目と3つ目のオペランドにはすべての型を利用できますが、
両方が同じ型である必要があります。
| 演算子 | 意味 | 例 |
|---|---|---|
c ? x : y | c が true ならば x を、 false ならば y を返します | int a = (x > 5) ? 10 : 0;// a は、x が 5 より大きければ 10 に、// さもなくば 0 になります。 |
演算子には以下に示す優先順位があります。
| 分類 | 式/演算子 |
|---|---|
| 基本式 | x.y, f(x), a[x], x++, x--, new, typeof, checked, unchecked |
| 単項式 | +, -, !, ~, ++x, --x, (T)x |
| 乗法式 | *, /, % |
| 加法式 | +, - |
| シフト | <<, >> |
| 関係式と型検査 | <, >, <=, >=, is, as |
| 等値式 | ==, != |
| 論理 AND | & |
| 論理 XOR | ^ |
| 論理 OR | | |
| 条件 AND | && |
| 条件 OR | || |
| 条件 | ?: |
| 代入 | =, *=, /=, %=, +=, -=, <<=, >>=, &=, ^=, |= |
優先順位の高いものから順番に計算が行われます。 また、優先順位が同じ場合、代入演算では右から、それ以外の演算では左から順に計算が行われます。