今回は、C#で使える演算子をまとめました。
算術演算子
算術演算子は、数値に対して足し算・引き算・掛け算・割り算などを行う演算子です。
以下のような種類があります。
- +(加算)
- –(減算)
- *(乗算)
- /(除算)
- %(剰余)
- ++(インクリメント)
- —(デクリメント)
例として、加算や減算を行うサンプルコードを示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
int x = 10; // 変数xを10で初期化 int y = 3; // 変数yを3で初期化 int sum = x + y; // 加算(10 + 3 = 13) int diff = x - y; // 減算(10 - 3 = 7) int product = x * y; // 乗算(10 * 3 = 30) int quotient = x / y; // 除算(10 / 3 = 3)※整数同士の場合は小数点以下切り捨て int remainder = x % y; // 剰余(10 % 3 = 1) x++; // xをインクリメント(x = 11) y--; // yをデクリメント(y = 2) Console.WriteLine($"sum: {sum}"); Console.WriteLine($"diff: {diff}"); Console.WriteLine($"product: {product}"); Console.WriteLine($"quotient: {quotient}"); Console.WriteLine($"remainder: {remainder}"); Console.WriteLine($"x: {x}"); Console.WriteLine($"y: {y}"); |
sum: 13
diff: 7
product: 30
quotient: 3
remainder: 1
x: 11
y: 2
代入演算子
代入演算子は、変数に値を代入するときに使います。
単純な代入(=)だけでなく、加算代入(+=)や減算代入(-=)など複合代入演算子も利用できます。
また、??=(null合体代入演算子)は変数がnullの場合のみ値を代入します。
以下のコードは複合代入演算子とnull合体代入演算子の例です。
1 2 3 4 5 6 7 8 9 10 11 12 |
int a = 5; // 変数aに5を代入 a += 3; // a = a + 3 → aは8 a -= 2; // a = a - 2 → aは6 a *= 4; // a = a * 4 → aは24 a /= 3; // a = a / 3 → aは8 a %= 5; // a = a % 5 → aは3 string? text = null; text ??= "default"; // textがnullの場合のみ"default"を代入 Console.WriteLine($"a: {a}"); Console.WriteLine($"text: {text}"); |
a: 3
text: default
比較(リレーショナル)演算子
値同士を比較して、等しいかどうか・大小関係などを判定するときに使うのが比較演算子です。
- ==(等価)
- !=(非等価)
- <(より小さい)
- >(より大きい)
- <=(以下)
- >=(以上)
以下にサンプルコードを示します。
1 2 3 4 5 6 7 8 9 |
int score = 75; bool isEqual = (score == 75); // true bool isNotEqual = (score != 100); // true bool isGreaterOrEqual = (score >= 60); // true if (isGreaterOrEqual) { Console.WriteLine("合格ラインを超えています"); } |
合格ラインを超えています
論理演算子
論理演算子は、ブール型(true/false)を扱うときに使用します。
- &&(論理AND)
- ||(論理OR)
- !(論理NOT)
以下の例では、年齢と登録状況を条件にしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
int age = 20; bool isRegistered = true; if(age >= 18 && isRegistered) { Console.WriteLine("利用できます"); } bool isActive = false; if(!isActive) { Console.WriteLine("アクティブではありません"); } |
利用できます
アクティブではありません
ビット演算子
ビット演算子は、整数のビット単位で演算を行うものです。
- &(ビットAND)
- |(ビットOR)
- ^(ビットXOR)
- ~(ビットNOT)
- <<(左シフト)
- >>(右シフト)
以下の例では、AND演算子とシフト演算子を用いたコードを示します。
1 2 3 4 5 6 7 8 9 10 |
int val1 = 0b1010; // 10進数で10 int val2 = 0b1100; // 10進数で12 int andResult = val1 & val2; // 0b1000 (10進数8) int shiftedLeft = 1 << 3; // 1を左に3ビットシフト (結果は8) int shiftedRight = 16 >> 2; // 16を右に2ビットシフト (結果は4) Console.WriteLine($"andResult: {andResult}"); Console.WriteLine($"shiftedLeft: {shiftedLeft}"); Console.WriteLine($"shiftedRight: {shiftedRight}"); |
andResult: 8
shiftedLeft: 8
shiftedRight: 4
条件(3項)演算子
条件演算子(?:)は、条件によって値を切り替える際に使われます。
if文よりも簡潔に表現できる場合に便利です。
1 2 3 |
int score2 = 55; string result = (score2 >= 60) ? "合格" : "不合格"; Console.WriteLine(result); |
不合格
null 関連演算子
null関連演算子は、変数がnullかどうかを簡単に判定したり、nullの場合に代替値を返したりするのに利用します。
- ??(null合体演算子)
- ?.(null条件演算子)
- ??=(null合体代入演算子、前述)
次のコードは、入力値がnullの場合に代替文字列を使用する例です。
1 2 3 4 5 6 7 8 |
string? input = null; string output = input ?? "未入力"; string? name = null; int? length = name?.Length; // nameがnullの場合、Lengthにはアクセスしない Console.WriteLine($"output: {output}"); Console.WriteLine($"length: {length?.ToString() ?? "null"}"); |
output: 未入力
length: null
型演算子
型演算子は、オブジェクトが特定の型かどうか調べたり、型情報を取得したりするときに使います。
- is
- as
- typeof
- nameof
- default
- sizeof
以下のコードはis演算子を使った例です。
1 2 3 4 5 6 7 8 9 10 11 12 |
object obj = "Hello C#"; if(obj is string) { Console.WriteLine("これは文字列です。"); } string? s = obj as string; // stringに変換できなければnull if(s != null) { Console.WriteLine($"変換後の文字列: {s}"); } |
これは文字列です。
変換後の文字列: Hello C#
その他の演算子
C#には、上記以外にも以下のような演算子があります。
- new(インスタンス生成)
- =>(ラムダ演算子)
- .(メンバーアクセス演算子)
- ->(ポインタメンバーアクセス演算子、アンセーフコードで使用)
- await(非同期メソッド内での待機)
- checked / unchecked(算術演算のオーバーフロー検出)
次の例ではラムダ式を用いて、渡された数値を二乗にする処理を表しています。
1 2 |
Func<int, int> square = x => x * x; Console.WriteLine(square(5)); |
25
注意点
演算子には優先順位と結合規則があり、複雑な式を書く場合は意図しない順序で評価されないように括弧を使うと安全です。
インクリメントやデクリメントなど、一部の演算子は前置(++i)と後置(i++)で挙動が異なるため注意が必要です。
nullを扱う演算子はコードを簡潔にしますが、設計時点でのnullチェックの方針を明確にするとスムーズです。
数値のオーバーフローが懸念される場合、checked/uncheckedを活用してエラーを検出できる状態にしておくと安心です。
まとめ
C#では、多様な演算子が用意されており、それぞれの目的に応じた使い分けが必要です。
演算子の特性や副作用、優先順位を把握しておくと、意図通りの処理を実装できます。
保守性と読みやすさを念頭に、適切な演算子を選択してコーディングを行いましょう。