回答:
両方のオペランドは、ブール型を持たないCから来た、異なるもののためのものでした。短絡バージョン|| ブール値でのみ機能しますが、非短絡バージョン| 整数型で機能し、ビット単位のORを実行します。たまたま、0または1の単一ビットで表されるブール値の非短絡論理演算として機能しました。
http://en.wikibooks.org/wiki/C_Sharp_Programming/Operators#Logical
|
演算子が2つのブール値or
に適用されると、2つの整数値に適用される場合と同じようにCILで同じ演算子にコンパイルされます- 条件付きで||
使用brtrue
してCILにコンパイルされるのとは異なりますジャンプ。
|
(ビットごとの論理和)は、のような型の非短絡回路でなければなりませんint
。これは、ほとんどの場合|
、正しい結果を計算するために式の両側を計算する必要があるためです。たとえば、どのような結果になり7 | f(x)
ますか?
f(x)
評価されない場合はわかりません。
さらに、この演算子bool
がに対して非短絡である場合、この演算子をに対して短絡させることは矛盾しint
ます。ちなみに、|
意図的に論理比較を行ったことは一度もない|
ので、論理演算子と言えば非常に不便です。
||
ただし、論理的な比較の場合は、短絡評価が適切に機能します。
同じことは、それらの演算子の起源が存在するCおよびC ++についても有効です。
これは正しいです。短絡OR演算子(||)は常に非短絡OR演算子(|)と同じ値を返します。(*)
ただし、最初のオペランドがtrueの場合、短絡演算子は2番目のオペランドを評価しませんが、非短絡演算子は常に両方のオペランドを評価します。これはパフォーマンスに影響を与える可能性があり、場合によっては副作用にも影響します。
したがって、両方の使用法があります。パフォーマンスを重視し、第2オペランドの評価で副作用が発生しない場合(または、それらを重視しない場合)は、必ず短絡演算子を使用してください。 。何らかの理由であなたがいる場合でも、必要な第二オペランドの副作用を、あなたは非短絡演算子を使用する必要があります。
非短絡演算子を使用する必要がある例:
if( write_customer_to_database() != SUCCESS |
write_supplier_to_database() != SUCCESS |
write_order_to_database() != SUCCESS )
{
transaction_rollback();
}
(*)最初のオペランドをfalseに評価すると、副作用によって2番目のオペランドがfalseではなくtrueに評価される、実際に異常なシナリオを除きます。
演算子の右側の句に副作用があり、プログラマが戻り値をチェックする前に両方の副作用を発生させたい場合。