C#演算子完全ガイド:算術・関係・論理・ビット演算子など
演算子とは、コンパイラに特定の数学的または論理的操作を実行させる記号です。C#には豊富な組み込み演算子があり、以下の種類に分類されます。
- 算術演算子
- 関係演算子
- 論理演算子
- ビット演算子
- 代入演算子
- その他の演算子
算術演算子
変数Aが10、変数Bが20を保持していると仮定します。
| 演算子 | 説明 | 例 |
|---|---|---|
+ | 2つのオペランドを加算 | A + B = 30 |
- | 第1オペランドから第2オペランドを減算 | A - B = -10 |
* | 2つのオペランドを乗算 | A * B = 200 |
/ | 分子を分母で除算 | B / A = 2 |
% | 剰余演算子(整数除算の余り) | B % A = 0 |
++ | インクリメント演算子(整数値を1増やす) | A++ = 11 |
-- | デクリメント演算子(整数値を1減らす) | A-- = 9 |
関係演算子
変数Aが10、変数Bが20を保持していると仮定します。
| 演算子 | 説明 | 例 |
|---|---|---|
== | 2つのオペランドの値が等しいか判定 | (A == B) は false |
!= | 2つのオペランドの値が等しくないか判定 | (A != B) は true |
> | 左オペランドが右オペランドより大きいか判定 | (A > B) は false |
< | 左オペランドが右オペランドより小さいか判定 | (A < B) は true |
>= | 左オペランドが右オペランド以上か判定 | (A >= B) は false |
<= | 左オペランドが右オペランド以下か判定 | (A <= B) は true |
論理演算子
変数Aがブール値true、変数Bがfalseを保持していると仮定します。
| 演算子 | 説明 | 例 |
|---|---|---|
&& | 論理AND:両オペランドが非ゼロならtrue | (A && B) は false |
|| | 論理OR:いずれかのオペランドが非ゼロならtrue | (A || B) は true |
! | 論理NOT:オペランドの論理状態を反転 | !(A && B) は true |
ビット演算子
ビット演算子はビット単位で動作し、ビットごとの演算を行います。
真理値表(&, |, ^)
| p | q | p & q | p | q | p ^ q |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 1 | 1 |
| 1 | 1 | 1 | 1 | 0 |
| 1 | 0 | 0 | 1 | 1 |
A = 60(0011 1100)、B = 13(0000 1101)とすると:
A & B = 0000 1100 (12)
A | B = 0011 1101 (61)
A ^ B = 0011 0001 (49)
~A = 1100 0011 (-61、2の補数表現)
| 演算子 | 説明 | 例 |
|---|---|---|
& | バイナリAND:両オペランドにビットが存在する場合に結果にコピー | (A & B) = 12 |
| | バイナリOR:いずれかのオペランドにビットが存在する場合にコピー | (A | B) = 61 |
^ | バイナリXOR:一方のオペランドにのみビットがセットされている場合にコピー | (A ^ B) = 49 |
~ | 1の補数(単項):ビットを反転 | (~A) = -61 |
<< | 左シフト:左オペランドの値を右オペランドで指定されたビット数だけ左に移動 | A << 2 = 240 |
>> | 右シフト:左オペランドの値を右オペランドで指定されたビット数だけ右に移動 | A >> 2 = 15 |
代入演算子
| 演算子 | 説明 | 例 |
|---|---|---|
= | 単純代入 | C = A + B |
+= | 加算代入 | C += A は C = C + A と等価 |
-= | 減算代入 | C -= A は C = C - A と等価 |
*= | 乗算代入 | C *= A は C = C * A と等価 |
/= | 除算代入 | C /= A は C = C / A と等価 |
%= | 剰余代入 | C %= A は C = C % A と等価 |
<<= | 左シフト代入 | C <<= 2 は C = C << 2 と等価 |
>>= | 右シフト代入 | C >>= 2 は C = C >> 2 と等価 |
&= | ビットAND代入 | C &= 2 は C = C & 2 と等価 |
^= | ビットXOR代入 | C ^= 2 は C = C ^ 2 と等価 |
|= | ビットOR代入 | C |= 2 は C = C | 2 と等価 |
その他の重要な演算子
| 演算子 | 説明 | 例 |
|---|---|---|
sizeof() | データ型のサイズを返す | sizeof(int) は 4 を返す |
typeof() | クラスの型を返す | typeof(StreamReader) |
& | 変数のアドレスを返す(unsafeコンテキストでのみ) | &a |
* | 変数へのポインタ(unsafeコンテキストでのみ) | *a |
? : | 条件演算子(三項演算子) | 条件 ? 値X : 値Y |
is | オブジェクトが特定の型か判定 | if (Ford is Car) |
as | キャスト失敗時に例外を投げずnullを返す | obj as StringReader |
演算子の優先順位
演算子の優先順位は、式における項のグループ化を決定し、評価順序に影響します。優先順位が高い演算子ほど先に評価されます。
例:x = 7 + 3 * 2 の場合、* が + より優先順位が高いため、まず 3*2=6 が計算され、次に 7+6=13 となります。x には 20 ではなく 13 が代入されます。
| カテゴリ | 演算子 | 結合規則 |
|---|---|---|
| 後置 | () [] -> . ++ -- | 左から右 |
| 単項 | + - ! ~ ++ -- (type)* & sizeof | 右から左 |
| 乗算 | * / % | 左から右 |
| 加算 | + - | 左から右 |
| シフト | << >> | 左から右 |
| 関係 | < <= > >= | 左から右 |
| 等価 | == != | 左から右 |
| ビットAND | & | 左から右 |
| ビットXOR | ^ | 左から右 |
| ビットOR | | | 左から右 |
| 論理AND | && | 左から右 |
| 論理OR | || | 左から右 |
| 条件 | ?: | 右から左 |
| 代入 | = += -= *= /= %= >>= <<= &= ^= |= | 右から左 |
| カンマ | , | 左から右 |
注意点とベストプラクティス
&&と||は短絡評価される(右辺が評価されない場合がある)- ビット演算子
&,|,^はブール値に対しても動作するが、短絡評価されない - 整数のオーバーフローには
checked/uncheckedコンテキストで対処可能 - 複雑な式は括弧で明示的にグループ化して可読性を高める
C言語
- C#演算子完全ガイド:C#における演算子の包括的解説
- C# ビット演算子とビットシフト演算子をマスターする:包括的ガイド
- C++演算子完全ガイド:算術・代入・関係・論理・ビット演算子と実例
- C言語演算子完全ガイド:算術・関係・論理・ビット演算子
- C 言語ビット演算子マスター: AND、OR、XOR、シフト、補数
- C言語演算子完全ガイド:種類、機能、実例付き解説
- C++演算子完全ガイド:種類、使い方、ベストプラクティス
- Verilog演算子:合成に必須の算術・制御演算子
- Python 演算子完全マスター: 包括的ガイド
- Java演算子をマスター:種類、構文、実践例
- Java演算子完全ガイド:算術/関係/ビット/論理/代入/三項/instanceof