|の違いは何ですか そして|| または演算子?


300

私は常に||C#とPHPの両方で、OR式で(2つのパイプ)を使用しました。たまに1本のパイプが使用されているのを見かけます|。これら2つの使用法の違いは何ですか?どちらか一方を使用する際に注意点はありますか、それとも互換性がありますか?

回答:


488

&and &&演算子と同様に、double演算子は「短絡」演算子です。

例えば:

if(condition1 || condition2 || condition3)

condition1がtrueの場合、条件2および3はチェックされません。

if(condition1 | condition2 | condition3)

これにより、1がすでに真である場合でも、条件2および3がチェックされます。条件は非常に高価な関数になる可能性があるため、これらを使用することでパフォーマンスを向上させることができます。

1つの大きな警告、NullReferencesまたは同様の問題があります。例えば:

if(class != null && class.someVar < 20)

クラスがnullの場合、ifステートメントclass != nullはfalseの後で停止します。&だけを使用すると、チェックが試行されclass.someVar、素晴らしい結果が得られますNullReferenceException。Or-Operatorを使用すると、何か悪いことを引き起こしたりする可能性は低いので、それほどトラップにはなりませんが、覚えておく必要があります。

ただし、各条件が実行する必要のある関数である設計がない限り、誰も単一&または|演算子を使用しません。デザインのにおいのように聞こえるかもしれませんが、(まれに)何かを行うためのクリーンな方法です。&オペレータは一方で、「これらの3つの機能を実行し、そのうちの一つがfalseを返した場合、elseブロックを実行し、」ん|「のみなし戻りfalseの場合、他のブロックを実行する」ん-役立つことができますが、言ったように、多くの場合、それはデザインですにおい。

|and &演算子の2番目の使用法があります:ビット演算


9
ええ、コンソールアプリを作成するまでは信じられませんでした。なぜ彼らはあなたに自分を吊るすロープを与えるのでしょう!私はVB.NETについてそれが嫌いでした-OrElseとAndAlsoキーワード!
ジャロッドディクソン

24
使用に人々を教える&|条件演算子としてはハックです、と彼らはこれまでC / C ++を使用する必要があればトラブルにそれらを取得します: 1 && 2真しばらくはされて1 & 2falseです。
BlueRaja-Danny Pflughoeft、2010年

47
これはハックではなく、7.10.3ブール論理演算子でC#に対して公式に指定されています。「xまたはyのいずれかがtrueの場合、x | yの結果はtrueです。それ以外の場合、結果はfalseです。」セクション7.11条件付き論理演算子も参照してください。「演算x || yは、演算x | yに対応しますが、yはxがfalseの場合にのみ評価されます。」さらに「合法化」| 条件演算子として。そして、C / C ++を使用する人は、ものごとが同じように機能することを盲目的に想定すると、とにかく問題が発生します。言ったように:使用| ifステートメントではデザインの匂いですが、完全に合法な操作です。
Michael Stum

9
私はそれが合法であるとは決して言いませんでした、それはそれがハックであるということだけです(あなたは&それがほとんど常に意味するもの以外の意味を伝えるために使用しています:ビットごと)
BlueRaja-Danny Pflughoeft

15
@ BlueRaja-DannyPflughoeft文書化された機能を使用することを意図したものであると記載されている場合、文書化された機能をハックと呼ぶのは、switch文を使用して「elseifハック」と言うようなものです。そのツールはツールボックスにあるツールで、めったに使用されない特殊なツールかもしれませんが、ツールはそれほどではありません。
2014

80

|| 論理OR演算子です。それが何であるかを基本的に知っているように思えます。if、whileなどの条件ステートメントで使用されます。

condition1 || condition2

condition1 OR condition2のいずれかがtrueの場合、trueと評価されます。

| ビットごとのOR演算子です。2つの数値の演算に使用されます。各数値の各ビットを個別に見て、ビットの1つが少なくとも1つの数値で1である場合、結果のビットも1になります。以下にいくつかの例を示します。

A = 01010101
B = 10101010
A | B = 11111111

A = 00000001
B = 00010000
A | B = 00010001

A = 10001011
B = 00101100

A | B = 10101111

うまくいけば、それは理にかなっています。

したがって、最後の2つの質問に答えるために、「2つの演算子の違いを知る」以外に注意点があるとは言いません。完全に異なる2つのことを行うため、互換性はありません。


これは、Mongodb C#ドライバーのフィルターをマージするためにビットごとのOR演算子を使用している方法を理解するのに役立ちました。gist.github.com/a3dho3yn/...
ドニーV.

30

1つは「ビット単位のOR」です。

10011b | 01000b => 11011b

もう1つはロジックまたはです。

trueまたはfalse => true


2
|bool短絡することなくタイプにも使用できます。
juharr 2018

14

良い質問。これら2つの演算子は、PHPとC#で同じように機能します。

|ビットごとのORです。2つの値をビットで比較します。例:1101 | 0010 =1111。これはビットオプションを使用する場合に非常に便利です。たとえば、読み取り= 01(0X01)書き込み= 10(0X02)読み取​​り/書き込み= 11(0X03)。有用な例の1つは、ファイルを開くことです。簡単な例は次のとおりです。

File.Open(FileAccess.Read | FileAccess.Write);  //Gives read/write access to the file

||論理ORです。これは、ほとんどの人がORを考え、真実に基づいて2つの値を比較する方法です。例えば、私は店に行くか、私はモールに行きます。これは、コードで最も頻繁に使用されるものです。例えば:

if(Name == "Admin" || Name == "Developer") { //allow access } //checks if name equals Admin OR Name equals Developer

PHPリソース:http : //us3.php.net/language.operators.bitwise

C#のリソース:http : //msdn.microsoft.com/en-us/library/kxszd0kx(VS.71).aspx

http://msdn.microsoft.com/en-us/library/6373h346(VS.71).aspx


4
FWIW、技術的には、C#|では論理またはブール値に適用されます。リンクされた参照状態として。実際には、最終的な結果はビット単位の演算子であるかのように同じです。なぜなら、ビット単位のtrueとのビット単位の値は、ビット単位のORの値が論理OR とfalseまったく同じ結果を生成するからです。つまり(int)(bool1 | bool2)== ((int)bool1) | ((int)bool2)です。
ToolmakerSteve 2016

4

Javaの簡単な例

public class Driver {

  static int x;
  static int y;

public static void main(String[] args) 
throws Exception {

System.out.println("using double pipe");
    if(setX() || setY())
        {System.out.println("x = "+x);
        System.out.println("y = "+y);
        }



System.out.println("using single pipe");
if(setX() | setY())
    {System.out.println("x = "+x);
    System.out.println("y = "+y);
    }

}

 static boolean setX(){
      x=5;
     return true;
  }
 static boolean setY(){
      y=5;
      return true;
  }
}

出力:

using double pipe
x = 5
y = 0
using single pipe
x = 5
y = 5

2
なぜあなたはjavaについてさえ言及していない質問のためにjavaの例を挙げますか?
juharr 2018

4

&-(条件1&条件2):最初のケースがfalseの場合でも両方のケースをチェックします

&&-(条件1 &&条件2):ケース1がfalseの場合、2番目のケースをチェックする必要はありません

&&-演算子は、コードをより速く専門的に実行し、ほとんど使用されません。

| -(条件1 |条件2):ケース1がtrueの場合でも両方のケースをチェックします

|| -(条件1 ||条件2):最初のケースがtrueの場合、2番目のケースをチェックする必要はありません

|| -オペレーターはコードをより速く専門的に実行します| めったに使用されません


2
rarely used?すべてはあなたが何をしたいか、何をする必要があるかによります。
Emaborsa

1
すごい!短くて甘いですが、「|はほとんど使用されません」と「&はほとんど使用されません」を削除します。
Iannick 2018

0

単一のパイプ|は、ビットごとの演算子の1つです。

ウィキペディアから:

Cプログラミング言語ファミリでは、ビットごとのOR演算子は「|」です。(パイプ)。繰り返しますが、この演算子は、オペランドをブール値として扱い、「||」と記述されるブール値の「論理OR」と混同しないでください。(2本のパイプ)。


0

数学的な定義では、ORおよびANDは2項演算子です。|と同様に、LHSおよびRHSの状態を確認します。と&。

|| および&& LHS条件が満たされない場合にOR演算子とAND演算子のプロパティを停止して、それらを停止します。


-1

| ||演算子は、2つのオペランドのビット単位のORを実行します(つまり、両側がfalseを返すためには、両側がfalseと評価される必要があります)。演算子は、必要な場合にのみ2番目の演算子を評価します。

http://msdn.microsoft.com/en-us/library/kxszd0kx(VS.71).aspx

http://msdn.microsoft.com/en-us/library/6373h346(VS.71).aspx


あなたが実際にそれらの記事を読めば、あなたは彼らがビット演算子を参照していることを見ているだろう
JOHNC

それはビットごとの意味ではありません。
juharr 2018

-1

単一のパイプ "|" 「ビット単位」であり、何をしているのかがわかっている場合にのみ使用してください。二重パイプ "||" 論理ORであり、「x == 0 || x == 1」のような論理ステートメントで使用できます。

次に、ビット単位または何をするかの例を示します。a= 0101およびb = 0011の場合、a | b = 0111です。0以外をtrueとして処理するロジックシステムを処理している場合、ビットごとのorは論理的orと同じように動作しますが、対応するもの(ビットごとの「&」)は動作しません。また、ビット単位または短絡評価を実行しません。


'|' bool短絡のないタイプにも使用できます。
juharr 2018

-2

単一のパイプ(|)は、ビット単位のOR演算子です。

2つのパイプ(||)は論理OR演算子です。

互換性はありません。


1
ビット単位の演算を無視すると、論理演算子領域内で、二重パイプは遅延評価であり、単一パイプは貪欲です。
アレックス・
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.