C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#における「||」演算子と「|」演算子の違いとは?

C#には、||論理OR(Logical OR)演算子|ビット単位の論理OR(Bitwise Logical OR)演算子として存在します。どちらもブール値に対して使用できますが、両者の根本的な違いは評価(実行)のされ方にあります。

構文はどちらも同じ形式です。

  • bool_exp1 || bool_exp2
  • bool_exp1 | bool_exp2

一見すると構文はよく似ていますが、実際の動作はまったく異なります。

|| 演算子(短絡評価)の動作

  • まず bool_exp1 が評価され、その結果によって2つ目の式を評価するかどうかが決定されます。
  • bool_exp1true であれば、OR の結果は確定して true となるため、2つ目の式を評価しても意味がありません。
  • bool_exp2 が評価されるのは、bool_exp1false を返した場合のみです。
  • このような動作から、||短絡演算子(ショートサーキット演算子)とも呼ばれます。最初の式の結果に基づいて、残りの評価を打ち切る(回路をショートさせる)ためです。

| 演算子(完全評価)の動作

  • 一方、| を使った場合、コンパイラは両方の式を必ず評価します。つまり、一方の結果に関係なく、両方のステートメントが実行されます。
  • 片方がすでに true である場合、もう片方を評価しても結果は変わらないため、これは非効率な処理と言えます。OR の結果が false になるのは、両方の式が false と評価されたときだけだからです。

論理OR(||)のコード例

using System;
namespace DemoApplication{
    public class Program{
        static void Main(string[] args){
            if(Condition1() || Condition2()){
                Console.WriteLine("Logical OR If Condition Executed");
            }
            Console.ReadLine();
        }
        static bool Condition1(){
            Console.WriteLine("Condition 1 executed");
            return true;
        }
        static bool Condition2(){
            Console.WriteLine("Condition 2 executed");
            return true;
        }
    }
}

出力結果

Condition 1 executed
Logical OR If Condition Executed

Condition1()true を返した時点で評価が打ち切られるため、Condition2() は実行されていません。

ビット単位の論理OR(|)のコード例

using System;
namespace DemoApplication{
    public class Program{
        static void Main(string[] args){
            if(Condition1() | Condition2()){
                Console.WriteLine("Logical OR If Condition Executed");
            }
            Console.ReadLine();
        }
        static bool Condition1(){
            Console.WriteLine("Condition 1 executed");
            return true;
        }
        static bool Condition2(){
            Console.WriteLine("Condition 2 executed");
            return true;
        }
    }
}

出力結果

Condition 1 executed
Condition 2 executed
Logical OR If Condition Executed

| を使用した場合は、Condition1() の結果に関係なく Condition2() も実行されていることがわかります。

まとめ

項目|| (論理OR)| (ビット単位の論理OR)
評価方式短絡評価(必要な場合のみ2つ目を評価)常に両方のオペランドを評価
パフォーマンス効率的やや非効率
主な用途ブール条件の判定ビット演算、副作用のあるメソッドを必ず実行したい場合

通常の条件分岐ではパフォーマンス面で有利な || を使うのが一般的ですが、右側の式に含まれる処理(メソッド呼び出しなど)を必ず実行したい特別なケースでは | が意図的に使われることもあります。

  1. Pythonの「!=」演算子と「<>」演算子の違いをわかりやすく解説

    Pythonには、2つの値が等しくないかどうかを判定するための比較演算子として、かつて「!=」と「<>」の2種類が存在していました。一見似ているこの2つの演算子ですが、Pythonのバージョンによって扱いが大きく異なります。本記事では、それぞれの違いと注意点を解説します。 Python 2.xでは両方の演算子が使用可能 Python 2.xでは、「!=」と「<>」のどちらの演算子も使用できます。どちらも動作はまったく同じで、2つのオペランド(被演算子)が等しくない場合にTrueを返し、等しい場合にはFalseを返します。 >>> 1 != 2 True >>&g

  2. Pythonの「=」と「==」の違いとは?代入と比較の使い分けを徹底解説

    Pythonにおける「=」と「==」の基本的な違いPythonでは「=」と「==」はまったく異なる役割を持つ記号です。初心者が混同しやすいポイントですが、それぞれの意味を正しく理解しておくことが重要です。「=」は代入演算子Pythonにおいて「=」記号は代入演算子として定義されています。左辺には1つの変数を、右辺には式を置く必要があり、右辺の式が評価された結果の値が、左辺の変数に格納されます。つまり、式と変数名は入れ替えて使うことはできません。>>> a=10 >>> b=20 >>> c=a+b >>> a,b,c (1