複雑な条件分岐と論理演算子
プログラミングにおいて、if文などで条件を判定する際、「Aという条件が真である」といった単一の条件だけでなく、「A かつ Bが真である」や「A または Bが真である」のように、複数の条件を組み合わせて判断したいケースが頻繁に発生します。
C#では、これらの複雑な論理的な組み合わせを実現するために、「論理演算子」が用意されています。この記事では、その中でも特に重要な&&(論理積:AND)と||(論理和:OR)について、その動作と注意点を詳しく解説します。
&& (AND) 演算子:論理積
&&演算子は、「かつ」を意味する論理積(AND)を表します。&&の左右にある2つの条件式が両方ともtrueである場合にのみ、式全体の結果がtrueとなります。
| 条件 A | 条件 B | A && B |
true | true | true |
true | false | false |
false | true | false |
false | false | false |
&& のコード例
例えば、「在庫が1以上あり、かつ、注文ステータスが “Pending”(保留中)である」場合にのみ処理を実行したい場合、以下のように記述します。
using System;
public class LogicalAndExample
{
public static void Main()
{
int stockQuantity = 5;
string orderStatus = "Pending";
// 2つの条件が両方とも true かどうかを判定
bool canProcessOrder = (stockQuantity > 0) && (orderStatus == "Pending");
if (canProcessOrder)
{
Console.WriteLine("注文を処理できます。");
}
else
{
Console.WriteLine("注文は処理できません。(在庫不足またはステータスが異なります)");
}
}
}
出力結果:
注文を処理できます。
もしstockQuantityが0であったり、orderStatusが “Shipped” であったりした場合、canProcessOrderはfalseとなり、elseブロックが実行されます。
|| (OR) 演算子:論理和
||演算子は、「または」を意味する論理和(OR)を表します。||の左右にある2つの条件式のうち、どちらか一方(あるいは両方)がtrueであれば、式全体の結果がtrueとなります。両方ともfalseの場合にのみ、結果がfalseになります。
| 条件 A | 条件 B | A || B |
| :— | :— | :— |
| true | true | true |
| true | false| true |
| false| true | true |
| false| false| false |
|| のコード例
例えば、「ユーザーの役割が “Admin”(管理者) または “Editor”(編集者)である」場合に、コンテンツの編集権限を与えたい場合、以下のように記述します。
using System;
public class LogicalOrExample
{
public static void Main()
{
string userRole = "Editor"; // ユーザーの役割
// どちらかの条件が true かどうかを判定
bool hasEditPermission = (userRole == "Admin") || (userRole == "Editor");
if (hasEditPermission)
{
Console.WriteLine("編集権限があります。コンテンツを編集できます。");
}
else
{
Console.WriteLine("閲覧権限のみです。");
}
}
}
出力結果:
編集権限があります。コンテンツを編集できます。
userRoleが “Guest” など、”Admin”でも “Editor”でもない場合にのみ、elseブロックが実行されます。
ショートサーキット評価(短絡評価)
&&と||の動作を理解する上で非常に重要な概念が「ショートサーキット評価(短絡評価)」です。C#の論理演算子は、式全体の結果が確定した時点で、それ以降の評価を省略します。
&& のショートサーキット
A && B の評価において、もしAがfalseであった場合、Bがtrueかfalseかに関わらず、式全体の結果は必ずfalseになります。
そのため、C#はAがfalseと評価された時点で、Bの評価を実行しません。
// `userObject` が null の場合、`userObject.IsEnabled` を評価すると
// NullReferenceException が発生してしまう。
// ショートサーキットのおかげで安全に実行できる
if (userObject != null && userObject.IsEnabled)
{
// userObject が null の場合、&& の右側は評価されないため例外が発生しない
}
|| のショートサーキット
A || B の評価において、もしAがtrueであった場合、Bがtrueかfalseかに関わらず、式全体の結果は必ずtrueになります。
そのため、C#はAがtrueと評価された時点で、Bの評価を実行しません。
! (NOT) 演算子:論理否定
!演算子は、bool値(trueまたはfalse)を反転させます。「~ではない」という条件を指定する際に使用します。
bool isConnected = false;
// ! を付けると true になる
if (!isConnected)
{
Console.WriteLine("接続されていません。");
}
演算子の優先順位と括弧
&&と||が混在する式を記述する場合、演算子の「優先順位」に注意が必要です。
!(NOT)が最も優先されます。&&(AND)は||(OR)よりも先に評価されます。
意図しない順序で評価されることを防ぐため、if文の条件式では、括弧 () を使って評価の順序を明示的に指定することが強く推奨されます。
using System;
public class PrecedenceExample
{
public static void Main()
{
bool hasCoupon = true;
bool isGoldMember = false;
int purchaseAmount = 5000;
// 意図: (ゴールド会員 または 5000円以上購入) かつ (クーポンを持っている)
// 括弧がない場合の評価順序 (&& が優先される)
// (isGoldMember) || (purchaseAmount >= 3000 && hasCoupon)
// (false) || (true && true) -> true
// 意図通りに括弧でグループ化する
if ((isGoldMember || purchaseAmount >= 3000) && hasCoupon)
{
Console.WriteLine("割引が適用されます。");
}
else
{
Console.WriteLine("割引は適用されません。");
}
}
}
まとめ
&&(AND): 両方の条件がtrueの時のみtrueとなります。||(OR): どちらか一方の条件がtrueの時にtrueとなります。- ショートサーキット:
&&は左側がfalseの時点で、||は左側がtrueの時点で評価を打ち切ります。これはnullチェックなどで重要な役割を果たします。 - 括弧
():&&と||を混在させる場合は、意図した評価順序を保証するために括弧を使用することが推奨されます。
