C#のOR演算子「||」「|」の違いと使い方を初心者向けにわかりやすく解説
はじめに
C#で条件分岐を書くときによく使うのが、OR演算子です。ORは日本語で「または」という意味を持ち、複数の条件のうちどれか1つでも成り立つかどうかを判定するときに使います。
たとえば、「ユーザーが管理者、または有料会員なら処理を許可する」といった条件をC#で書く場合にOR演算子が役立ちます。
C#のOR演算子には、主に「||」と「|」があります。見た目は似ていますが、動きには重要な違いがあります。特に初心者のうちは、「||」と「|」を混同しやすいため、使い分けを正しく理解しておくことが大切です。
この記事では、C#のOR演算子「||」「|」の違いと使い方を、初心者向けにわかりやすく解説します。
1. C#のOR演算子とは?「または」を表す基本を理解しよう
C#のOR演算子は、複数の条件のうち、少なくとも1つが成り立つかどうかを判定するための演算子です。
プログラムでは、条件によって処理を分ける場面が多くあります。その中で「AまたはBなら処理する」という条件を表したいときにOR演算子を使います。
1-1. OR演算子は複数条件のうち1つでもtrueならtrueになる
OR演算子は、複数の条件のうち1つでもtrueであれば、全体の結果がtrueになります。
たとえば、次のような条件を考えてみます。
C#bool isAdmin = true;
bool isMember = false;
この場合、「管理者である、または会員である」という条件は成り立ちます。なぜなら、isAdminがtrueだからです。
C#bool result = isAdmin || isMember;
Console.WriteLine(result);
実行結果は次のようになります。
C#True
OR演算では、両方がtrueである必要はありません。どちらか一方がtrueなら、結果はtrueになります。
1-2. C#でORを表す代表的な演算子は「||」と「|」
C#でORを表す代表的な演算子は、次の2つです。
C#||
|
||は、条件付き論理OR演算子と呼ばれます。主にif文などの条件式で使います。
一方、|は、論理OR演算子としても使えますが、整数型に対して使うとビットOR演算子として動作します。
初心者がまず覚えるべきなのは、通常の条件分岐では基本的に||を使うということです。
1-3. if文でOR演算子がよく使われる場面
OR演算子は、if文でよく使われます。
たとえば、次のような場面です。
C#int score = 85;
if (score >= 80 || score == 100)
{
Console.WriteLine("合格です");
}
この例では、「点数が80点以上、または100点である」という条件を判定しています。
より実用的な例では、次のように使います。
C#string role = "admin";
if (role == "admin" || role == "manager")
{
Console.WriteLine("管理画面にアクセスできます");
}
このコードでは、roleがadminまたはmanagerの場合に処理が実行されます。
1-4. 初心者が混同しやすい「OR」「AND」「NOT」の違い
条件式では、OR以外にもANDやNOTがよく使われます。
ORは「または」を表します。
C#if (a || b)
{
}
これは、aまたはbのどちらかがtrueなら処理を実行します。
ANDは「かつ」を表します。
C#if (a && b)
{
}
これは、aとbの両方がtrueの場合だけ処理を実行します。
NOTは「ではない」を表します。
C#if (!a)
{
}
これは、aがfalseの場合に処理を実行します。
つまり、意味を整理すると次のようになります。
| 演算子 | 意味 | 例 |
|---|---|---|
| ` | ` | |
&& | かつ | AかつB |
! | ではない | Aではない |
2. C#の「||」とは?条件付き論理OR演算子の使い方
C#の||は、条件付き論理OR演算子です。通常、bool型の条件式に対して使います。
if文で「AまたはBなら処理する」と書きたい場合は、基本的に||を使います。
2-1. 「||」の基本構文と読み方
||は、次のように書きます。
C#条件式A || 条件式B
読み方は「条件式A または 条件式B」です。
たとえば、次のように使います。
C#if (age >= 65 || isStudent)
{
Console.WriteLine("割引対象です");
}
このコードは、「65歳以上、または学生なら割引対象」という意味です。
2-2. bool型の条件式で使う基本例
||は、bool型の値に対して使えます。
C#bool hasTicket = true;
bool isStaff = false;
if (hasTicket || isStaff)
{
Console.WriteLine("入場できます");
}
この例では、hasTicketがtrueなので、isStaffがfalseでも条件全体はtrueになります。
OR演算の結果は、次のように考えるとわかりやすいです。
| 左側 | 右側 | 結果 |
|---|---|---|
true | true | true |
true | false | true |
false | true | true |
false | false | false |
両方がfalseの場合だけ、結果がfalseになります。
2-3. if文で「AまたはB」を判定するサンプルコード
次の例では、入力された文字列がyesまたはyかどうかを判定しています。
C#string input = "yes";
if (input == "yes" || input == "y")
{
Console.WriteLine("処理を続行します");
}
else
{
Console.WriteLine("処理を中止します");
}
inputがyesの場合、左側の条件がtrueになります。そのため、if文の中の処理が実行されます。
大文字と小文字の違いも許可したい場合は、次のように書けます。
C#string input = "Y";
if (input == "yes" || input == "y" || input == "YES" || input == "Y")
{
Console.WriteLine("処理を続行します");
}
ただし、条件が増えると読みにくくなるため、実際にはToLower()などを使って整理することもあります。
C#string input = "Y";
string lowerInput = input.ToLower();
if (lowerInput == "yes" || lowerInput == "y")
{
Console.WriteLine("処理を続行します");
}
2-4. 「||」は左側がtrueなら右側を評価しない
||の重要な特徴は、左側の条件がtrueだった場合、右側の条件を評価しないことです。
これを短絡評価といいます。
次のコードを見てください。
C#bool CheckA()
{
Console.WriteLine("CheckAが呼ばれました");
return true;
}
bool CheckB()
{
Console.WriteLine("CheckBが呼ばれました");
return false;
}
if (CheckA() || CheckB())
{
Console.WriteLine("条件が成立しました");
}
この場合、CheckA()がtrueを返すため、CheckB()は呼び出されません。
実行結果は次のようになります。
C#CheckAが呼ばれました
条件が成立しました
OR演算では、左側がtrueなら結果は必ずtrueです。そのため、右側を確認する必要がないのです。
2-5. 短絡評価によってエラーや無駄な処理を防げる理由
短絡評価は、エラーを防ぐためにも役立ちます。
たとえば、文字列がnullでない場合だけ、文字数を確認したいとします。
C#string? name = null;
if (name != null && name.Length > 0)
{
Console.WriteLine("名前が入力されています");
}
これはAND演算子の例ですが、短絡評価の考え方はORでも重要です。
ORの場合も、左側の条件で結果が確定すれば、右側の処理を実行しません。
C#string? name = null;
if (name == null || name.Length == 0)
{
Console.WriteLine("名前が入力されていません");
}
このコードでは、name == nullがtrueになるため、name.Length == 0は評価されません。そのため、nullに対してLengthを呼び出すことがなく、例外を防げます。
もしここで||ではなく|を使うと、右側も必ず評価されるため、例外が発生する可能性があります。
3. C#の「|」とは?論理OR演算子・ビットOR演算子の使い方
C#の|は、使う対象によって意味が変わります。
bool型に対して使うと、論理OR演算子として動作します。
一方、intなどの整数型に対して使うと、ビットOR演算子として動作します。
3-1. bool型で使う「|」の基本的な動き
bool型で|を使うと、OR演算として動作します。
C#bool a = true;
bool b = false;
bool result = a | b;
Console.WriteLine(result);
実行結果は次のようになります。
C#True
このように、bool型で使う場合、結果だけを見ると||と同じになることがあります。
C#bool result1 = a || b;
bool result2 = a | b;
どちらも、aまたはbのどちらかがtrueならtrueになります。
3-2. 「|」は左側がtrueでも右側を必ず評価する
|が||と大きく違う点は、左側がtrueでも右側を必ず評価することです。
次のコードを見てください。
C#bool CheckA()
{
Console.WriteLine("CheckAが呼ばれました");
return true;
}
bool CheckB()
{
Console.WriteLine("CheckBが呼ばれました");
return false;
}
if (CheckA() | CheckB())
{
Console.WriteLine("条件が成立しました");
}
実行結果は次のようになります。
C#CheckAが呼ばれました
CheckBが呼ばれました
条件が成立しました
CheckA()がtrueを返しているにもかかわらず、CheckB()も呼び出されています。
このように、|は右側の処理を必ず実行したい場合に使えます。ただし、通常のif文では||を使うことが多いです。
3-3. intなどの整数型ではビット単位のOR演算になる
|をintなどの整数型に使うと、ビット単位のOR演算になります。
ビットとは、コンピューターが扱う0と1の情報です。
たとえば、次のような2つの値があるとします。
C#int a = 5; // 0101
int b = 3; // 0011
この2つを|で演算すると、各ビットを比較して、どちらかが1なら1になります。
C#int result = a | b;
Console.WriteLine(result);
ビットで見ると、次のようになります。
C#0101
| 0011
= 0111
0111は10進数で7なので、実行結果は次のようになります。
C#7
3-4. ビットORの簡単なサンプルコード
ビットORの動きを確認するサンプルコードです。
C#int a = 5; // 0101
int b = 3; // 0011
int result = a | b;
Console.WriteLine(result);
実行結果は次の通りです。
C#7
もう少しわかりやすく、2進数の文字列として表示してみます。
C#int a = 5;
int b = 3;
int result = a | b;
Console.WriteLine(Convert.ToString(a, 2));
Console.WriteLine(Convert.ToString(b, 2));
Console.WriteLine(Convert.ToString(result, 2));
実行結果の例です。
C#101
11
111
桁をそろえて考えると、次のようになります。
C#0101
0011
0111
3-5. フラグ管理で「|」が使われるケース
|は、フラグ管理でよく使われます。
たとえば、読み取り権限、書き込み権限、実行権限をビットで管理する場合です。
C#[Flags]
enum Permission
{
None = 0,
Read = 1,
Write = 2,
Execute = 4
}
複数の権限を組み合わせたい場合、|を使います。
C#Permission permission = Permission.Read | Permission.Write;
Console.WriteLine(permission);
このコードでは、ReadとWriteを組み合わせた権限を作っています。
フラグ列挙型では、|を使うことで複数の値を1つにまとめられます。
4. 「||」と「|」の違いを初心者向けに比較
||と|は、どちらもORに関係する演算子ですが、使い方と動作が異なります。
特に重要なのは、右側の式を評価するかどうかです。
4-1. 最大の違いは右側の式を評価するかどうか
||は、左側がtrueなら右側を評価しません。
C#if (true || SomeMethod())
{
}
この場合、SomeMethod()は呼び出されません。
一方、|は左側がtrueでも右側を評価します。
C#if (true | SomeMethod())
{
}
この場合、SomeMethod()は呼び出されます。
この違いは、メソッド呼び出しやnullチェックが含まれる条件式で特に重要です。
4-2. bool型での結果は同じでも処理の流れが違う
bool型で使う場合、||と|は最終的な真偽値が同じになることがあります。
C#bool a = true;
bool b = false;
Console.WriteLine(a || b);
Console.WriteLine(a | b);
どちらも結果はtrueです。
しかし、条件式の中にメソッド呼び出しがある場合、処理の流れが変わります。
C#if (CheckA() || CheckB())
{
}
この場合、CheckA()がtrueならCheckB()は呼ばれません。
C#if (CheckA() | CheckB())
{
}
この場合、CheckA()がtrueでもCheckB()は呼ばれます。
結果が同じでも、途中の処理が違う点に注意しましょう。
4-3. 整数型で使えるかどうかの違い
||は、基本的にbool型の条件式に使います。
C#bool result = true || false;
一方、|は整数型にも使えます。
C#int result = 5 | 3;
この場合、|はビットOR演算になります。
||を整数型に使うことはできません。
C#int result = 5 || 3; // エラー
このように、整数のビット演算をしたい場合は|を使います。
4-4. パフォーマンスや副作用に関わる違い
||は、左側の条件だけで結果が決まる場合、右側を評価しません。そのため、不要な処理を省けます。
C#if (isValid || HeavyCheck())
{
}
isValidがtrueなら、HeavyCheck()は呼び出されません。
一方、|は必ず両方を評価します。
C#if (isValid | HeavyCheck())
{
}
この場合、isValidがtrueでもHeavyCheck()が呼ばれます。
右側の処理に時間がかかる場合、|を使うと無駄な処理が増える可能性があります。
また、右側のメソッドがデータ更新やログ出力などの副作用を持っている場合、||と|でプログラムの動きが変わります。
4-5. 比較表で見る「||」と「|」の使い分け
||と|の違いを表にまとめると、次のようになります。
| 項目 | || | | |
|---|---|---|
| 主な用途 | 条件分岐のOR | 論理OR、ビットOR |
| bool型で使えるか | 使える | 使える |
| 整数型で使えるか | 使えない | 使える |
| 左側がtrueのとき | 右側を評価しない | 右側も評価する |
| 短絡評価 | あり | なし |
| if文での通常利用 | よく使う | あまり使わない |
| ビット演算 | 不可 | 可能 |
| 初心者へのおすすめ | 基本はこちら | 必要な場面だけ使う |
5. 「||」と「|」の使い分け方
C#でOR演算子を使うときは、目的に応じて||と|を使い分ける必要があります。
初心者のうちは、まず「通常の条件分岐では||を使う」と覚えておくとよいでしょう。
5-1. 通常の条件分岐では基本的に「||」を使う
if文で「AまたはB」を判定したい場合は、基本的に||を使います。
C#if (userName == "admin" || userName == "root")
{
Console.WriteLine("管理者ユーザーです");
}
このような条件式では、||を使うことで短絡評価が働き、不要な評価を避けられます。
読みやすさの面でも、C#では条件分岐のORとして||が一般的です。
5-2. 右側の処理も必ず実行したい場合は「|」を検討する
右側の処理を必ず実行したい場合は、|を使うことがあります。
C#bool result = CheckA() | CheckB();
この場合、CheckA()の結果に関係なく、CheckB()も必ず実行されます。
ただし、このようなコードは意図が伝わりにくい場合があります。
右側の処理を必ず実行したいのであれば、次のように分けて書いたほうが読みやすいこともあります。
C#bool resultA = CheckA();
bool resultB = CheckB();
if (resultA || resultB)
{
Console.WriteLine("条件が成立しました");
}
この書き方なら、両方のメソッドを実行したうえでOR判定していることが明確になります。
5-3. ビット演算やフラグ操作では「|」を使う
ビット演算やフラグ操作では、|を使います。
C#Permission permission = Permission.Read | Permission.Write;
このような場面では、||ではなく|が正しい演算子です。
||は真偽値の条件判定に使うものであり、ビットの組み合わせには使えません。
5-4. 初心者はまず「if文のORは||」と覚える
初心者は、まず次のように覚えるのがおすすめです。
C#if文で「または」を書くなら ||
たとえば、次のようなコードです。
C#if (age < 13 || age >= 65)
{
Console.WriteLine("割引対象です");
}
このような一般的な条件分岐では、||を使えば問題ありません。
|は、ビット演算や特別な理由がある場合に使うものとして理解しておきましょう。
5-5. 現場で読みやすいコードを書くための判断基準
現場でコードを書くときは、動けばよいだけでなく、他の人が読みやすいことも大切です。
条件分岐で|を使うと、「なぜ||ではないのか」と疑問を持たれることがあります。
そのため、通常は次の基準で考えるとよいです。
| 目的 | 使う演算子 |
|---|---|
| if文でAまたはBを判定したい | ` |
| nullチェックを含む条件を書きたい | ` |
| 不要な処理を避けたい | ` |
| 両方の式を必ず評価したい | ` |
| ビット演算をしたい | ` |
| フラグを組み合わせたい | ` |
迷った場合は、通常の条件式では||を使うと考えてください。
6. C#のOR演算子でよくある間違いと注意点
C#のOR演算子は便利ですが、書き間違いや使い分けのミスによって、思わぬエラーやバグが発生することがあります。
ここでは、初心者が特に注意したいポイントを解説します。
6-1. 「or」と書いてもC#ではOR演算子にならない
C#では、OR演算子としてorとは書きません。
C#if (a or b)
{
}
このような書き方は、通常の条件式ではエラーになります。
C#で「または」を表すときは、基本的に||を使います。
C#if (a || b)
{
}
ただし、C#のパターンマッチングではorパターンが使える場面があります。
C#if (value is 1 or 2)
{
Console.WriteLine("1または2です");
}
これは通常のOR演算子とは別の機能です。初心者のうちは、通常の条件式では||を使うと覚えておきましょう。
6-2. 「||」を「|」と書き間違えるミス
||と|は見た目が似ているため、書き間違えやすいです。
C#if (isAdmin | isMember)
{
Console.WriteLine("アクセスできます");
}
このコードは、bool型であれば動作します。
しかし、|は右側も必ず評価します。そのため、意図せずメソッドが呼ばれたり、例外が発生したりすることがあります。
通常の条件分岐では、次のように||を使いましょう。
C#if (isAdmin || isMember)
{
Console.WriteLine("アクセスできます");
}
6-3. 「&&」と「||」を混同するミス
&&はAND演算子で、「かつ」を意味します。
||はOR演算子で、「または」を意味します。
たとえば、「年齢が13歳未満、または65歳以上なら割引」としたい場合は、||を使います。
C#if (age < 13 || age >= 65)
{
Console.WriteLine("割引対象です");
}
これを&&で書くと、意味が変わってしまいます。
C#if (age < 13 && age >= 65)
{
Console.WriteLine("割引対象です");
}
この条件は、「13歳未満かつ65歳以上」という意味になり、通常は成立しません。
条件の意味を日本語で考えて、「または」なら||、「かつ」なら&&を使いましょう。
6-4. nullチェックで「|」を使うと例外が起きることがある
nullチェックでは、|ではなく||を使うべき場面が多いです。
次のコードは問題があります。
C#string? text = null;
if (text == null | text.Length == 0)
{
Console.WriteLine("空です");
}
text == nullがtrueでも、|は右側のtext.Length == 0を評価します。
そのため、textがnullの場合、NullReferenceExceptionが発生します。
正しくは、次のように||を使います。
C#string? text = null;
if (text == null || text.Length == 0)
{
Console.WriteLine("空です");
}
text == nullがtrueなら右側は評価されないため、安全に判定できます。
6-5. 条件式が複雑なときは括弧で優先順位を明確にする
条件式が複雑になると、演算子の優先順位がわかりにくくなります。
C#if (isAdmin || isManager && isActive)
{
Console.WriteLine("アクセスできます");
}
このコードは、次のように解釈されます。
C#if (isAdmin || (isManager && isActive))
{
Console.WriteLine("アクセスできます");
}
&&のほうが||より優先順位が高いためです。
ただし、読み手にとってわかりにくい場合があります。意図を明確にするため、括弧を使うのがおすすめです。
C#if ((isAdmin || isManager) && isActive)
{
Console.WriteLine("アクセスできます");
}
このように書けば、「管理者またはマネージャーで、かつ有効なユーザー」という意味が明確になります。
7. OR演算子の実践サンプル
ここからは、C#のOR演算子を実際のコードで確認していきます。
||と|の使い方を、具体的な場面ごとに見ていきましょう。
7-1. ユーザー入力が複数の値のどれかに一致するか判定する
ユーザーの入力が、複数の値のどれかに一致するかを判定する例です。
C#Console.Write("コマンドを入力してください: ");
string? command = Console.ReadLine();
if (command == "start" || command == "run")
{
Console.WriteLine("処理を開始します");
}
else if (command == "stop" || command == "end")
{
Console.WriteLine("処理を終了します");
}
else
{
Console.WriteLine("不明なコマンドです");
}
このコードでは、startまたはrunが入力された場合に処理を開始します。
stopまたはendが入力された場合は、処理を終了します。
複数の候補のうち、どれか1つに一致すればよい場合に||が便利です。
7-2. 年齢や会員区分など複数条件で分岐する
年齢や会員区分を使った条件分岐の例です。
C#int age = 70;
bool isPremiumMember = false;
if (age >= 65 || isPremiumMember)
{
Console.WriteLine("特別割引の対象です");
}
else
{
Console.WriteLine("通常料金です");
}
このコードでは、65歳以上またはプレミアム会員なら特別割引の対象になります。
age >= 65がtrueなので、isPremiumMemberがfalseでも条件全体はtrueになります。
7-3. nullチェックと文字列判定を組み合わせる
文字列がnullまたは空文字かどうかを判定する例です。
C#string? name = null;
if (name == null || name == "")
{
Console.WriteLine("名前が入力されていません");
}
else
{
Console.WriteLine($"こんにちは、{name}さん");
}
このコードでは、nameがnullの場合、右側のname == ""も安全に評価できます。
ただし、文字列がnullまたは空文字かを判定する場合は、次のように書くこともできます。
C#string? name = null;
if (string.IsNullOrEmpty(name))
{
Console.WriteLine("名前が入力されていません");
}
実務では、string.IsNullOrEmpty()を使うと読みやすくなります。
7-4. メソッド呼び出しを含む条件式で短絡評価を確認する
||の短絡評価を確認する例です。
C#bool IsValidUser()
{
Console.WriteLine("IsValidUserが呼ばれました");
return true;
}
bool HasPermission()
{
Console.WriteLine("HasPermissionが呼ばれました");
return false;
}
if (IsValidUser() || HasPermission())
{
Console.WriteLine("処理を実行できます");
}
実行結果は次のようになります。
C#IsValidUserが呼ばれました
処理を実行できます
IsValidUser()がtrueを返したため、HasPermission()は呼び出されません。
次に、|を使った場合を見てみます。
C#if (IsValidUser() | HasPermission())
{
Console.WriteLine("処理を実行できます");
}
実行結果は次のようになります。
C#IsValidUserが呼ばれました
HasPermissionが呼ばれました
処理を実行できます
|を使うと、左側がtrueでも右側が必ず評価されることがわかります。
7-5. フラグ列挙型でビットORを使う
フラグ列挙型で|を使う例です。
C#[Flags]
enum FileAccess
{
None = 0,
Read = 1,
Write = 2,
Execute = 4
}
複数の権限を組み合わせます。
C#FileAccess access = FileAccess.Read | FileAccess.Write;
Console.WriteLine(access);
実行結果は次のようになります。
C#Read, Write
権限を持っているか確認したい場合は、HasFlag()を使えます。
C#if (access.HasFlag(FileAccess.Read))
{
Console.WriteLine("読み取り権限があります");
}
if (access.HasFlag(FileAccess.Execute))
{
Console.WriteLine("実行権限があります");
}
else
{
Console.WriteLine("実行権限はありません");
}
このように、フラグ列挙型では|を使って複数の値を組み合わせます。
8. C#のOR演算子と関連して覚えたい演算子
C#のOR演算子を理解するなら、関連する演算子も一緒に覚えておくと便利です。
ここでは、AND、NOT、XOR、null合体演算子、条件演算子について簡単に解説します。
8-1. AND演算子「&&」「&」との違い
AND演算子は、「かつ」を表します。
よく使うのは&&です。
C#if (age >= 20 && hasLicense)
{
Console.WriteLine("運転できます");
}
このコードは、「20歳以上かつ免許を持っている」という条件です。
&&は、左側がfalseなら右側を評価しません。
一方、&をbool型で使うと、左側がfalseでも右側を評価します。
C#if (CheckA() & CheckB())
{
}
ORの||と|の関係に似ています。
| 意味 | 短絡評価あり | 短絡評価なし |
|---|---|---|
| OR | ` | |
| AND | && | & |
8-2. NOT演算子「!」の使い方
NOT演算子は、真偽値を反転します。
C#bool isLoggedIn = false;
if (!isLoggedIn)
{
Console.WriteLine("ログインしてください");
}
isLoggedInがfalseなので、!isLoggedInはtrueになります。
OR演算子と組み合わせることもあります。
C#if (!isLoggedIn || isGuest)
{
Console.WriteLine("利用制限があります");
}
このコードは、「ログインしていない、またはゲストユーザーである」場合に処理を実行します。
8-3. XOR演算子「^」の使い方
XOR演算子^は、どちらか一方だけがtrueの場合にtrueになります。
C#bool a = true;
bool b = false;
Console.WriteLine(a ^ b);
実行結果は次のようになります。
C#True
両方がtrueの場合はfalseになります。
C#bool a = true;
bool b = true;
Console.WriteLine(a ^ b);
実行結果は次のようになります。
C#False
XORは、「AまたはBのどちらか一方だけ」という条件を表したいときに使えます。
8-4. null合体演算子「??」との違い
null合体演算子??は、左側がnullの場合に右側の値を使う演算子です。
C#string? name = null;
string displayName = name ?? "ゲスト";
Console.WriteLine(displayName);
実行結果は次のようになります。
C#ゲスト
||は真偽値のOR演算に使います。
C#if (name == null || name == "")
{
Console.WriteLine("名前がありません");
}
一方、??は値の代替を指定するときに使います。
C#string displayName = name ?? "ゲスト";
つまり、||は条件判定、??はnullの場合の値の補完に使うと考えるとわかりやすいです。
8-5. 条件演算子「?:」との使い分け
条件演算子?:は、条件によって値を切り替える演算子です。
C#int score = 80;
string result = score >= 60 ? "合格" : "不合格";
Console.WriteLine(result);
実行結果は次のようになります。
C#合格
OR演算子は、条件そのものを組み合わせるために使います。
C#if (score >= 90 || hasBonus)
{
Console.WriteLine("特別評価です");
}
条件演算子は、条件に応じて値を選ぶときに使います。
C#string message = score >= 60 ? "合格" : "不合格";
役割が違うため、目的に応じて使い分けましょう。
9. C#のOR演算子に関するよくある質問
ここでは、C#のOR演算子について初心者が疑問に感じやすいポイントをまとめます。
9-1. C#で「または」はどう書く?
C#で「または」を書く場合、通常の条件式では||を使います。
C#if (a || b)
{
Console.WriteLine("aまたはbがtrueです");
}
if文で「AまたはBなら処理する」と書きたい場合は、基本的に||を使いましょう。
9-2. 「||」と「|」はどちらを使えばいい?
通常の条件分岐では、||を使います。
C#if (isAdmin || isMember)
{
Console.WriteLine("アクセスできます");
}
|は、右側も必ず評価したい場合や、ビット演算、フラグ操作で使います。
C#Permission permission = Permission.Read | Permission.Write;
初心者は、まず「if文のORは||」と覚えるのがおすすめです。
9-3. 「|」をif文で使っても問題ない?
bool型の条件式であれば、|をif文で使うこと自体は可能です。
C#if (a | b)
{
}
ただし、|は左側の結果に関係なく右側も必ず評価します。
そのため、通常の条件分岐では||を使うほうが安全で読みやすいです。
C#if (a || b)
{
}
|を使う場合は、「右側も必ず評価したい」という明確な理由があるときにしましょう。
9-4. 「||」で右側の処理が実行されないのはなぜ?
||は短絡評価を行うためです。
OR演算では、左側がtrueなら、全体の結果は必ずtrueになります。
そのため、右側を評価する必要がありません。
C#if (true || SomeMethod())
{
}
この場合、SomeMethod()は呼び出されません。
この仕組みによって、不要な処理を避けたり、nullチェックで例外を防いだりできます。
9-5. C#に「or」というキーワードはある?
C#には、パターンマッチングで使うorパターンがあります。
C#if (number is 1 or 2)
{
Console.WriteLine("1または2です");
}
ただし、通常の条件式で「または」を表す演算子としてorを書くわけではありません。
次のような書き方は通常のOR演算子としては使えません。
C#if (a or b)
{
}
通常の条件式では、次のように||を使います。
C#if (a || b)
{
}
まとめ
C#のOR演算子は、「AまたはB」のように複数条件のうち1つでも成り立つかを判定するときに使います。
通常の条件分岐では、基本的に||を使います。
C#if (a || b)
{
Console.WriteLine("aまたはbがtrueです");
}
||は短絡評価を行うため、左側がtrueなら右側を評価しません。これにより、不要な処理を避けたり、nullチェックで例外を防いだりできます。
一方、|はbool型に対して使うと論理ORとして動作しますが、左側がtrueでも右側を必ず評価します。また、intなどの整数型ではビットOR演算子として使われます。
C#int result = 5 | 3;
フラグ列挙型で複数の値を組み合わせる場合にも、|を使います。
C#Permission permission = Permission.Read | Permission.Write;
初心者は、まず次のように覚えておくと安心です。
| 場面 | 使う演算子 |
|---|---|
| if文で「または」を表したい | ` |
| nullチェックを安全に書きたい | ` |
| 両方の式を必ず評価したい | ` |
| ビット演算をしたい | ` |
| フラグを組み合わせたい | ` |
C#でORを使うときは、通常の条件式では||、ビット演算やフラグ操作では|と考えると、使い分けがしやすくなります。

