C#: 演算子と式
1. 算術演算子
算術演算子は、加算、減算、乗算、除算、剰余などの基本的な数学演算を実行します。
| 演算子 | 名前 | 例 | 結果 |
|---|---|---|---|
+ |
追加 | 5 + 3 |
8 |
- |
引き算 | 5 - 3 |
2 |
* |
掛け算 | 5 * 3 |
15 |
/ |
部門 | 7 / 2 |
3 |
% |
モジュラス | 7 % 2 |
1 |
警告:整数除算では小数部が切り捨てられます。
7 / 2の結果は3となり、3.5にはなりません。浮動小数点数の結果を得るには、少なくとも一方のオペランドが浮動小数点型である必要があります。例えば、7.0 / 2の結果は3.5となります。
▶ サンプル
using System;
class Program
{
static void Main()
{
int a = 17, b = 5;
Console.WriteLine($"Addition: {a} + {b} = {a + b}");
Console.WriteLine($"Subtraction: {a} - {b} = {a - b}");
Console.WriteLine($"Multiplication: {a} * {b} = {a * b}");
Console.WriteLine($"Integer division: {a} / {b} = {a / b}");
Console.WriteLine($"Floating-point division: {a * 1.0} / {b} = {a * 1.0 / b}");
Console.WriteLine($"Modulus: {a} % {b} = {a % b}");
}
}
Addition: 17 + 5 = 22
Subtraction: 17 - 5 = 12
Multiplication: 17 * 5 = 85
Integer division: 17 / 5 = 3
Floating-point division: 17 / 5 = 3.4
Modulus: 17 % 5 = 2
2. インクリメント演算子とデクリメント演算子
インクリメント演算子 ++ とデクリメント演算子 -- は、変数の値を 1 増減させます。接頭辞形式では、値を使用する前に変更を行い、接尾辞形式では、まず値を使用してから変更を行います。
| 演算子 | 名称 | 説明 |
|---|---|---|
++x |
接頭辞のインクリメント | 1 ずつ増やしてからその値を使用する |
x++ |
末尾加算 | 値を使用し、その後1を加算する |
--x |
プレフィックス減算 | 1を減算してから、その値を使用する |
x-- |
末尾減算 | 値を使用し、その後1を減算する |
▶ サンプル
using System;
class Program
{
static void Main()
{
int x = 10;
int y = 10;
Console.WriteLine($"Prefix increment: ++x = {++x}, x = {x}");
Console.WriteLine($"Postfix increment: y++ = {y++}, y = {y}");
int m = 5;
int n = 5;
Console.WriteLine($"Prefix decrement: --m = {--m}, m = {m}");
Console.WriteLine($"Postfix decrement: n-- = {n--}, n = {n}");
}
}
Prefix increment: ++x = 11, x = 11
Postfix increment: y++ = 10, y = 11
Prefix decrement: --m = 4, m = 4
Postfix decrement: n-- = 5, n = 4
3. 関係演算子
関係演算子は2つの値を比較し、boolの結果(trueまたはfalse)を返します。
| 演算子 | 名前 | 例 | 結果 |
|---|---|---|---|
== |
等しい | 5 == 5 |
true |
!= |
異なる | 5 != 3 |
true |
< |
未満 | 3 < 5 |
true |
> |
より大きい | 5 > 3 |
true |
<= |
以下 | 5 <= 5 |
true |
>= |
以上 | 5 >= 6 |
false |
ヒント:
=(代入)と==(等価性チェック)を混同しないでください。ifの条件式内で=を使用すると、コンパイルエラーや論理的なバグが発生します。
4. 論理演算子
論理演算子はブール式を結合します。C# では、&& および || が短絡評価とともに使用されます。これは、結果がすでに決定している場合、2 番目のオペランドは評価されないことを意味します。
| 演算子 | 名称 | 例 | 説明 |
|---|---|---|---|
&& |
論理AND | a && b |
両方が真の場合に真(短絡評価) |
| ` | ` | 論理OR | |
! |
論理NOT | !a |
値を反転させる |
警告:C#での論理演算には
&&および||を使用してください。&および|は使用しないでください。後者はビット演算子であり、ブール値に対しても演算を行えますが、短絡評価を行いません。
▶ サンプル
using System;
class Program
{
static void Main()
{
int age = 25;
bool hasLicense = true;
bool canDrive = age >= 18 && hasLicense;
Console.WriteLine($"Can drive: {canDrive}");
bool isWeekend = false;
bool isHoliday = true;
bool dayOff = isWeekend || isHoliday;
Console.WriteLine($"Day off: {dayOff}");
bool isRaining = true;
Console.WriteLine($"Not raining: {!isRaining}");
}
}
Can drive: True
Day off: True
Not raining: False
5. 代入演算子
代入演算子は、変数に値を代入します。複合代入演算子は、演算と代入を1つのステップにまとめます。
| 演算子 | 相当する式 | 例 |
|---|---|---|
= |
x = 10 |
|
+= |
x = x + y |
x += 5 |
-= |
x = x - y |
x -= 3 |
*= |
x = x * y |
x *= 2 |
/= |
x = x / y |
x /= 4 |
%= |
x = x % y |
x %= 3 |
6. 条件演算子
条件演算子 ?: は、C# で唯一の三項演算子です。これは、条件に基づいて 2 つの値のうちの 1 つを返します。
構文:condition ? valueIfTrue : valueIfFalse
▶ サンプル
using System;
class Program
{
static void Main()
{
int score = 72;
string result = score >= 60 ? "Pass" : "Fail";
Console.WriteLine($"Score {score}: {result}");
int a = 15, b = 9;
int max = a > b ? a : b;
Console.WriteLine($"Larger value: {max}");
}
}
Score 72: Pass
Larger value: 15
7. ヌル結合演算子
?? 演算子は、左辺のオペランドが null の場合、右辺のオペランドを返し、それ以外の場合は左辺の値を返します。 ??= 演算子(C# 8)は、変数が null の場合にのみ値を代入する null 結合代入演算子です。
using System;
class Program
{
static void Main()
{
string name = null;
string display = name ?? "Anonymous";
Console.WriteLine($"Name: {display}");
int? count = null;
int total = count ?? 0;
Console.WriteLine($"Total: {total}");
string title = null;
title ??= "Default Title";
Console.WriteLine($"Title: {title}");
title ??= "New Title";
Console.WriteLine($"Title: {title}");
}
}
Name: Anonymous
Total: 0
Title: Default Title
Title: Default Title
8. ヌル条件演算子
?. 演算子は、メンバーにアクセスする前に、オブジェクトが null かどうかを確認します。オブジェクトが null の場合、この式は NullReferenceException をスローするのではなく、null を返します。
using System;
class Program
{
static void Main()
{
string text = "Hello C#";
Console.WriteLine($"Length: {text?.Length}");
text = null;
Console.WriteLine($"Length: {text?.Length}");
int? len = text?.Length;
Console.WriteLine($"Type: {len?.GetType().Name ?? "null"}");
}
}
Length: 8
Length:
Type: null
9. 演算子の優先順位
以下の表は、C# でよく使われる演算子を、優先順位の高い順から低い順に並べたものです。同じ行にある演算子は、優先順位が同じです。
| 優先度 | 演算子 | 説明 |
|---|---|---|
| 1 | x++ x-- . ?. () [] |
ポストフィックス、メンバーアクセス |
| 2 | ++x --x +x -x ! ~ |
接頭辞、単項 |
| 3 | * / % |
乗法 |
| 4 | + - |
添加剤 |
| 5 | < > <= >= is as |
リレーショナル、型チェック |
| 6 | == != |
平等 |
| 7 | && |
論理AND |
| 8 | ` | |
| 9 | ?? ??= |
ヌル結合 |
| 10 | ?: |
条件付き |
| 11 | = += -= *= /= %= など |
課題 |
ヒント:演算の優先順位がわからない場合は、括弧
()を使って評価順序を明確にしてください。これにより、エラーを防ぎ、可読性を高めることができます。
❓ よくある質問
7 / 2 は 3 になります。 浮動小数点除算では小数部分が保持されます。例えば、7.0 / 2 の結果は 3.5 となります。++x と x++ の違いは何ですか?++x はまず値をインクリメントしてから新しい値を返します。一方、x++ は現在の値を返してからインクリメントします。 単独の文では動作は同じですが、式の中では結果が異なります。&& と & の違いは何ですか?&& は、左側のオペランドが偽の場合、右側のオペランドをスキップする短絡論理ANDです。 &はビット単位のAND演算子であり、ブール値に対しても演算を行えますが、常に両側の値を評価します。??と?.は、それぞれどのような場合に使用すべきですか???は、nullの場合のデフォルト値を指定するために使用します。?.は、nullになる可能性のあるオブジェクトのメンバに安全にアクセスし、NullReferenceExceptionを回避するために使用します。📖 まとめ
- 算術演算子は数学的な計算を行います。整数除算では小数部分が切り捨てられる点に注意してください。
- インクリメントとデクリメントには、評価のタイミングが異なるプレフィックス形式とポストフィックス形式がある
- 関係演算子は、条件論理に対して
boolの値を返す - 論理演算子
&&および||は、短絡評価に対応しています - 複合代入演算子は、演算と代入を組み合わせたものです
- 条件演算子
?:は、簡潔な三項選択式です ??は null に対するデフォルト値を提供し、?.はメンバー変数に安全にアクセスし、??=は null の場合にのみ代入を行います- 優先順位(高い順):後置演算 → 一項演算 → 乗算 → 加算 → 関係演算 → 等価演算 → 論理 AND → 論理 OR → ヌル結合 → 条件演算 → 代入演算
📝 練習問題
- 整数除算の切り捨て挙動を確認しつつ、
7 / 2および7.0 / 2を計算し、その結果を出力するプログラムを作成してください。 - 式における
++xとx++の違いを示すプログラムを作成してください。int a = 5を設定し、++a * 3とa++ * 3をそれぞれ計算して、その結果を出力してください。 - 条件演算子を使用して、整数が正、0、または負のいずれであるかを判定するプログラムを作成してください(ネストは許可されます
?:)。 string変数をnullに設定して作成し、??と?.を使用してそのデフォルト値を出力し、その長さを安全に取得するプログラムを作成してください。2 + 3 * 4と(2 + 3) * 4を評価するプログラムを作成し、括弧が優先順位にどのように影響するかを示してください。