可能性のある複製:
c#の|と||の違いについてのわかりやすい、わかりやすい説明
との比較の違いは何ですか|および||またはC#とJavascriptで&と&&?
例:
if(test == test1 | test1 == test2) or if(test == test1 || test1 == test2)
if(test == test1 & test1 == test2) or if(test == test1 && test1 == test2)
c(およびおそらく他の言語)では、単一の|
または&
はビット単位の比較です。
二重の||
または&&
は論理比較です。
編集:「短絡なし」に関する以下のMehrdadのコメントを必ずお読みください
実際には、true
は1
と同等であることが多く、false
は0
と同等であることが多いため、ビット単位の比較は有効である可能性があり、正確に戻る同じ結果。
かつてミッションクリティカルなソフトウェアコンポーネントがあり、静的コードアナライザーを実行しましたが、論理比較が必要な場所でビット単位の比較が使用されていることが指摘されました。 Cで書かれており、論理比較の配置のため、ソフトウェアはどちらでも問題なく機能しました。例:
if ( (altitide > 10000) & (knots > 100) )
...
&および|整数とブールの両方の引数を操作できるビット単位の演算子、および&&と||ブール引数でのみ操作できる論理演算子です。多くの言語では、両方の引数がブール値である場合、重要な違いは、論理演算子が短絡評価を実行し、最初の引数で答えを決定するのに十分な場合、2番目の引数を評価しないことです(&&の場合、最初の場合引数がfalseの場合、2番目の引数は無関係です)。
&および|は二項演算子である一方、||および&&はブール値です。
大きな違い:
(1&2)は0、false
(1 && 2)はtrue
(C、C++、Java、JavaScriptを想定)
|
および&
はビット単位の演算子であり、||
および&&
は論理演算子です。通常、ifステートメントやループなどに||
および&&
を使用します(つまり、上記の例の場合)。ビット演算子は、ビットマスク内のビットを設定およびチェックするためのものです。
単一の文字(|または&)を使用しているインスタンスは、結果のビットごとの比較です。言語がこれらの式をバイナリ値に評価する限り、同じ結果を返す必要があります。ただし、ベストプラクティスとしては、論理演算子を使用する必要があります(つまり)。
&および|通常、ビット単位の演算です。
どこ&&および||通常は論理演算です。
比較のために、すべてが1または0のいずれかを返すのであれば、まったく問題ありません。それ以外の場合は、誤検知を返す可能性があります。読みづらいバグを防ぐために、これを避けるべきです。