2008-08-29 4 views
231

私はいつもC#とPHPの両方でOR式で||(2本のパイプ)を使用してきました。場合によっては、使用するパイプが1つ表示されます。|。これらの2つの使い方の違いは何ですか?他のものを使用しているときに警告がありますか、それとも互換性がありますか?|の違いは何ですか? ||または演算子?

答えて

380

double演算子は、&&&のように、 "短絡"演算子です。例えば

if(condition1 || condition2 || condition3) 

条件1がtrueの場合、条件2と3がチェックされません。

if(condition1 | condition2 | condition3) 

これは、1がすでに真であっても条件2と3をチェックします。条件が非常に高価な関数になる可能性があるため、それらを使用することでパフォーマンスが向上します。

大きな注意点、Null参照などがあります。例:クラスがnullである

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

場合class != nullが偽の後に、if文が停止します。 &だけを使用している場合は、class.someVarをチェックしようとすると、NullReferenceExceptionという素敵なものが得られます。あなたが何か悪いことを引き起こす可能性は低いので、それほど多くの罠ではないかもしれないOr-Operatorで、それは心に留めておくべきことです。

各条件が実行されるべき機能である設計をしていない限り、&または|演算子は一度も使用しません。デザインの匂いのように聞こえますが、時には(まれに)それはきれいなものです。 &演算子は「これらの3つの関数を実行し、いずれかがfalseを返す場合はelseブロックを実行します」、|は「falseを返す場合にのみelseブロックを実行します」 - 有用かもしれませんが、デザインの匂い。

ただし、|&オペレータの2番目の使用方法はBitwise Operationsです。

+42

なぜこれが下降しているのか分かりません - 正しいです!もしあなたが彼を信じていなければ、あなたのコンパイラで二重にチェックしてください! –

+8

ええ、私はコンソールアプリケーションを作成するまで、私はそれを信じませんでした - しかし、良い主よ!なぜ彼らはあなたにロープをかけて自分をぶら下げるのですか?私はVB.NETについて - OrElseとAndAlsoのキーワードについて嫌いでした! –

+1

これらのコマンドの短絡性が大好き!私はこれを常に使用して、最初のチェックが成功した場合にのみ2番目のチェックを実行します。ヌルオブジェクトのチェック例: if(myObj!= null && myObj.resultCode == 0)Console.WriteLine( "Yay!") ; – joshperry

26

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

10011b | 01000b => 11011b

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

trueまたはfalse => true

0

The |演算子は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

+0

これらの記事を実際に読んでいると、ビット演算子を参照していることがわかります – johnc

0

焦がすパイプ "|"または「ビット単位」であり、あなたが何をしているのかを知っているときにのみ使用すべきです。二重管 "||"は論理的であり、 "x == 0 || x == 1"のような論理文で使用できます。

ここでは、ビット単位またはビット単位の例を示します。a = 0101およびb = 0011の場合、a | b = 0111です。ゼロ以外の値を真として扱う論理システムを扱っているなら、論理演算子と同じようにビット演算子が動作しますが、それと同等です(ビット単位で "&")。また、ビットごとに、または短絡評価を行わない。

-1

単一のパイプ(|)はbitwise OR operatorです。

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

これらは互換性がありません。

+0

ビット演算を無視すると、論理演算子領域内で2重パイプが遅延評価され、パイプが貪欲です。 – Alex

-1

|| (2本のパイプ)は通常論理です。 (1つのパイプ)はバイナリまたはです。私の頭の上から離れて、その違いが(他のものに結果を割り当てるとき以外の)大きな落とし穴になるとは思えません。しかし、私は他の誰かがそれが重要な状況を持つことを確信しています。

編集:これは、私がこれを書くのにかかった時間で6つの答えがあります。

66

||論理OR演算子です。あなたは基本的にそれが何であるかを知っているように聞こえる。 if、whileなどの条件文で使用されます。

condition1 || condition2 

条件1または条件2のいずれかが真である場合、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つの全く異なることをしているので交換できません。

10

良い質問です。これらの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

+0

FWIW、技術的にはC#で '|'は**論理型です** **ブール値に適用されます**。あなたのリンクされた参照状態として。実際には、最終結果はビット演算子の場合と同じです。なぜなら、 '真'と '偽'のビット単位の値は、その値のビット単位で論理的な結果と全く同じ結果を生成するためです。それは '(int)(bool1 | bool2)' == '((int)bool1)です。 ((int)bool2) 'を返します。 – ToolmakerSteve

1

単一のパイプ、|、bitwise事業者の一つです。ウィキペディアから

: "|" Cプログラミング言語ファミリーで

、ビット単位のOR演算子です(パイプ)。ここでも、このオペレータは、そのオペランドをブール値として扱うブール "論理"または "同等"と混同してはならず、 "||" (2本のパイプ)。

-1

ビット単位(|)対論理(||)! ビット演算子がこれらのオブジェクトを見て、視覚的に双子であるかどうかを見るのではなく(ロジックのように)、DNAサンプルを実行して0と1の代わりに。 Javaで

3

簡単な例

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 
0

、ORおよびAND二項演算子です。 |と同様に、LHS条件とRHS条件を検証します。および&。

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

1

& - (条件1 &条件2):最初のものは

& &偽の場合でもチェック両方の場合 - (条件1 & &条件2):ケース1つが第二ケースをチェックする気dosen't はfalseです

& & - オペレータは、専門的に&はほとんど使用されません、より速くあなたのコードの実行を行います

| - (条件1 |条件2):ケース1が真であっても両方のケースをチェックする。

|| - (条件1 ||条件2):最初に が真である場合、第2のケースをチェックするのをやめてください。

|| - 演算子はあなたのコードをより速く、専門的に実行させます|ほとんど使用されない

関連する問題