[C#] 論理演算子の一覧とその使い方
C#の論理演算子は、ブール値を操作するために使用されます。
主な論理演算子には以下があります。
&&
は論理積(AND)で、両方のオペランドがtrue
のときにtrue
を返します。
||
は論理和(OR)で、いずれかのオペランドがtrue
のときにtrue
を返します。
!
は論理否定(NOT)で、オペランドのブール値を反転させます。
&
と|
はビット単位のANDとORですが、ブール値にも使用可能で、短絡評価を行いません。
^
は排他的論理和(XOR)で、オペランドが異なる場合にtrue
を返します。
これらの演算子は条件式や制御フローでよく使われます。
論理演算子の種類
C#における論理演算子は、条件式の評価やビット操作において重要な役割を果たします。
ここでは、代表的な論理演算子について詳しく解説します。
論理積(AND)演算子 &&
論理積演算子 &&
は、二つの条件が共に真である場合にのみ真を返します。
条件式の評価においてよく使用されます。
bool isAdult = true; // 成人かどうか
bool hasLicense = false; // 免許を持っているかどうか
if (isAdult && hasLicense)
{
Console.WriteLine("運転できます。");
}
else
{
Console.WriteLine("運転できません。");
}
運転できません。
この例では、isAdult
と hasLicense
の両方が真でないと「運転できます。」と表示されません。
論理和(OR)演算子 ||
論理和演算子 ||
は、二つの条件のうち少なくとも一つが真である場合に真を返します。
bool isWeekend = true; // 週末かどうか
bool isHoliday = false; // 祝日かどうか
if (isWeekend || isHoliday)
{
Console.WriteLine("休みです。");
}
else
{
Console.WriteLine("仕事です。");
}
休みです。
この例では、isWeekend
または isHoliday
のどちらかが真であれば「休みです。」と表示されます。
論理否定(NOT)演算子 !
論理否定演算子 !
は、条件の真偽を反転させます。
真であれば偽に、偽であれば真に変わります。
bool isRaining = false; // 雨が降っているかどうか
if (!isRaining)
{
Console.WriteLine("外出できます。");
}
else
{
Console.WriteLine("外出できません。");
}
外出できます。
この例では、isRaining
が偽であるため、!isRaining
は真となり「外出できます。」と表示されます。
ビット単位のAND演算子 &
ビット単位のAND演算子 &
は、対応するビットが両方とも1である場合に1を返します。
ビット操作に使用されます。
int a = 0b1100; // 12
int b = 0b1010; // 10
int result = a & b;
Console.WriteLine(Convert.ToString(result, 2)); // 2進数で表示
1000
この例では、a
と b
のビットごとのAND演算を行い、結果は 0b1000
となります。
ビット単位のOR演算子 |
ビット単位のOR演算子 |
は、対応するビットのどちらかが1である場合に1を返します。
int a = 0b1100; // 12
int b = 0b1010; // 10
int result = a | b;
Console.WriteLine(Convert.ToString(result, 2)); // 2進数で表示
1110
この例では、a
と b
のビットごとのOR演算を行い、結果は 0b1110
となります。
排他的論理和(XOR)演算子 ^
排他的論理和演算子 ^
は、対応するビットが異なる場合に1を返します。
int a = 0b1100; // 12
int b = 0b1010; // 10
int result = a ^ b;
Console.WriteLine(Convert.ToString(result, 2)); // 2進数で表示
110
この例では、a
と b
のビットごとのXOR演算を行い、結果は 0b0110
となります。
論理演算子の使い方
論理演算子は、プログラムの条件分岐や制御フローを構築する際に非常に重要です。
ここでは、論理演算子の具体的な使い方について解説します。
条件式での使用例
論理演算子は、条件式を組み合わせて複雑な条件を表現するために使用されます。
以下の例では、複数の条件を組み合わせて、特定の条件を満たすかどうかを判断します。
int age = 25; // 年齢
bool hasTicket = true; // チケットを持っているかどうか
if (age >= 18 && hasTicket)
{
Console.WriteLine("イベントに参加できます。");
}
else
{
Console.WriteLine("イベントに参加できません。");
}
イベントに参加できます。
この例では、age
が18以上であり、かつ hasTicket
が真である場合に「イベントに参加できます。」と表示されます。
制御フローでの活用
論理演算子は、制御フローを制御するためにも使用されます。
特に、if
文や while
ループなどで条件を組み合わせる際に役立ちます。
int score = 85; // スコア
if (score >= 90)
{
Console.WriteLine("評価: 優");
}
else if (score >= 70 && score < 90)
{
Console.WriteLine("評価: 良");
}
else
{
Console.WriteLine("評価: 可");
}
評価: 良
この例では、score
の値に応じて異なる評価を表示します。
&&
演算子を使用して、スコアが70以上かつ90未満である条件を表現しています。
短絡評価とその利点
短絡評価とは、論理演算子 &&
や ||
を使用する際に、左側の条件だけで結果が決まる場合、右側の条件を評価しないことを指します。
これにより、不要な計算を省略し、パフォーマンスを向上させることができます。
bool isValid = false; // 有効かどうか
int value = 10; // 値
if (isValid && (value / 0 > 1))
{
Console.WriteLine("条件を満たしています。");
}
else
{
Console.WriteLine("条件を満たしていません。");
}
条件を満たしていません。
この例では、isValid
が偽であるため、value / 0
の計算は行われず、プログラムはエラーを回避します。
短絡評価により、無駄な計算を防ぎ、プログラムの安全性を高めることができます。
論理演算子の応用例
論理演算子は、基本的な条件評価だけでなく、さまざまな応用に利用できます。
ここでは、論理演算子を用いた応用例を紹介します。
複雑な条件分岐の実装
複雑な条件分岐を実装する際に、論理演算子を組み合わせることで、コードを簡潔かつ明確に記述できます。
bool isMember = true; // 会員かどうか
bool hasCoupon = false; // クーポンを持っているかどうか
int purchaseAmount = 5000; // 購入金額
if ((isMember && purchaseAmount > 3000) || hasCoupon)
{
Console.WriteLine("割引が適用されます。");
}
else
{
Console.WriteLine("割引は適用されません。");
}
割引が適用されます。
この例では、会員でかつ購入金額が3000円を超える場合、またはクーポンを持っている場合に割引が適用されます。
論理演算子を使うことで、条件を明確に表現しています。
フラグ管理における活用
ビット演算子を用いることで、フラグ管理を効率的に行うことができます。
複数の状態を一つの整数で管理する際に便利です。
const int FLAG_READ = 0b0001; // 読み取りフラグ
const int FLAG_WRITE = 0b0010; // 書き込みフラグ
const int FLAG_EXECUTE = 0b0100; // 実行フラグ
int permissions = FLAG_READ | FLAG_WRITE; // 読み取りと書き込みの権限を持つ
if ((permissions & FLAG_EXECUTE) != 0)
{
Console.WriteLine("実行権限があります。");
}
else
{
Console.WriteLine("実行権限がありません。");
}
実行権限がありません。
この例では、permissions変数
に読み取りと書き込みの権限を設定し、実行権限があるかどうかをビット演算で確認しています。
パフォーマンスの最適化
論理演算子を用いることで、条件評価のパフォーマンスを最適化することができます。
特に、短絡評価を活用することで、不要な計算を省略できます。
bool isAvailable = true; // 利用可能かどうか
int expensiveCalculation = 0; // 高コストな計算結果
if (isAvailable || (expensiveCalculation = PerformExpensiveCalculation()) > 0)
{
Console.WriteLine("利用可能です。");
}
else
{
Console.WriteLine("利用できません。");
}
int PerformExpensiveCalculation()
{
// 高コストな計算をシミュレート
Console.WriteLine("高コストな計算を実行中...");
return 42;
}
利用可能です。
この例では、isAvailable
が真であるため、PerformExpensiveCalculation
は呼び出されません。
短絡評価により、計算コストを削減しています。
まとめ
この記事では、C#における論理演算子の種類や使い方、応用例について詳しく解説しました。
論理演算子を活用することで、条件分岐や制御フローを効率的に構築できることがわかります。
これを機に、実際のプログラムで論理演算子を活用し、より洗練されたコードを書いてみてはいかがでしょうか。