C# と PHP の両方で、OR 式で常に||
(2 つのパイプ) を使用してきました。ときどき、単一のパイプが使用されているのを見ます: |
. これら2つの使用法の違いは何ですか? どちらか一方を使用する際の注意事項はありますか、それとも交換可能ですか?
12 に答える
&
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
is false の後で停止します。& のみを使用すると、チェックが試行されclass.someVar
、nice が返されますNullReferenceException
。Or-Operator を使用すると、何か悪いことをトリガーする可能性が低いため、それほどトラップではないかもしれませんが、覚えておく必要があります。
ただし、各条件が実行される関数である設計がない限り、単一の&
or演算子を使用する人はいません。|
デザインの臭いのように聞こえますが、時には (まれに) クリーンな方法です。演算子は「これらの&
3 つの関数を実行し、そのうちの 1 つが false を返した場合、else ブロックを実行します」が、「何|
も false を返さない場合にのみ else ブロックを実行します」 - 便利な場合がありますが、前述のように、多くの場合、それは設計です匂い。
|
ただし、 and&
演算子の 2 番目の使用法があります: Bitwise Operations。
|| 論理 OR 演算子です。それが何であるかを基本的に知っているように聞こえます。if、while などの条件文で使用されます。
condition1 || condition2
condition1 または 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 つの完全に異なることを行うため、これらは互換性がありません。
1 つは「ビットごとの OR」です。
10011b | 01000b => 11011b
もう 1 つは論理 or です。
真または偽 => 真
良い質問。これら 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
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
数学的な定義によると、OR と AND は二項演算子です。| と同様に、LHS と RHS の条件に関係なく検証します。と &。
|| && は、LHS 条件が満たされない場合に OR 演算子と AND 演算子を停止することで、それらのプロパティを変更します。
単一のパイプ | は、ビット演算子の 1 つです。
ウィキペディアから:
C プログラミング言語ファミリでは、ビットごとの OR 演算子は "|" です。(パイプ)。繰り返しますが、この演算子は、そのオペランドをブール値として扱い、「||」と書かれたブール型の「論理和」と混同しないでください。(2本のパイプ)。
| | || 演算子は、2 つのオペランドのビットごとの OR を実行します (つまり、false を返すには、両側が false に評価される必要があります)。operator は、必要な場合にのみ 2 番目の演算子を評価します。
http://msdn.microsoft.com/en-us/library/kxszd0kx(VS.71).aspx
http://msdn.microsoft.com/en-us/library/6373h346(VS.71).aspx
シングルパイプ "|" は「ビット単位」の or であり、自分が何をしているのかがわかっている場合にのみ使用する必要があります。二重パイプ「||」は論理和であり、"x == 0 || x == 1" のような論理ステートメントで使用できます。
ビットごとの or の例を次に示します。a=0101 かつ b=0011 の場合、a|b=0111 です。ゼロ以外を真として扱う論理システムを扱っている場合、ビットごとの or は論理 or と同じように動作しますが、対応する (ビットごとの and、「&」) は動作しません。また、ビットごとの or は短絡評価を実行しません。