&&および|| 論理的ではなく条件演算子ですか?


62

私は、と述べているMSDNのC#のドキュメントで少し混乱しています&し、|論理演算子とそのある&&||の条件付き演算子です。

&&||および!論理演算子を呼び出し続けているので、間違っていますか?


4
論理的ではないように見えますが、2つのクラスには重要な違いがあり、多くの場合、プログラムの動作に明らかな変更を加えずに交換できる場合でも、たとえば、|と交換可能であると想定しないことが重要です||
ダニエルRヒックス

回答:


120

私は、と述べているMSDNのC#のドキュメントで少し混乱しています&し、|論理演算子とそのある&&||の条件付き演算子です。&&||および!論理演算子を呼び出し続けているので、間違っていますか?

番号; あなたは正しいです。

MSDNドキュメントには、多くの重要でない重要な命名法エラーが多数あります。できるだけ多くの人を探し出そうとしましたが、それがひどく間違っていて誤解を招かない場合は、必ずしも時間を賢く使うとは限りません。C#機能の名前に関する明確な説明が必要な場合は、仕様に進んでください。

したがって、関連する権限はC#仕様であり、セクション7.11に記載されています。

&^、および|演算子は、論理演算子と呼ばれます。

次に、組み込みの論理演算子をさらに整数、列挙、ブールおよびヌル可能ブール論理演算子に分解します。ユーザー定義の論理演算子もあります。詳細については、仕様を参照してください。

セクション7.12では、

演算子は、条件付きの論理演算子と呼ばれています。これらは、「短絡」論理演算子とも呼ばれます。&&||

したがって、それらはすべて論理演算子です。それらのいくつかは条件付き論理演算子です。

条件付き論理演算子を条件付きにするものは何ですか?条件付きステートメントif)または条件式? :)で一般的に使用されるためだと推測するかもしれません。本当の理由は仕様によって与えられます:

&&そして||オペレータは、条件付きのバージョンである&|演算子:操作は、x && y操作に対応するx & yこと以外は、y場合にのみ評価されるx偽ではありません。操作は、trueでない場合にのみ評価されることを除いて、operationにx || y対応します。x | yyx

したがって、条件付き論理演算子は、右側のオペランドが左側のオペランドの値に応じて条件付きで評価されるため名前が付けられます。

条件付き論理演算子条件式の単なる「構文糖」であることに注意することで、これをより鮮明に見ることができます。 x && yは単に書くより楽しい方法x ? y : falseであり、x || y単に書くより楽しい方法x ? true : yです。 条件付き論理式は、実際には条件式です。

条件付き論理演算子のユーザー定義形式もあり、少し注意が必要です。詳細については、仕様を参照してください。

このテーマに興味がある場合は、さらに読みます:


3
@RobertHarvey:そうです、&はブール、整数型、または列挙型を操作できますが、&&はブールだけを操作できるという事実は、演算子の「条件付き」形式に名前を付けるという選択とは関係ありません。条件演算子は、評価セマンティクスに条件分岐があるため条件付きです。
エリックリッパー

16
説明した意味では、「条件演算子」よりも「短絡演算子」という用語の方がはるかに一般的であり、おそらく曖昧ではないという印象を受けます。
Doc Brown

15
@DocBrown:それは確かに人気がありますが、私はいつもその名前が紛らわしいことを発見しました。結果を得るための「短絡」と「ショートカット」は同じものだと思った人によって造られたようです。短絡は、電気システムをすぐに破壊する危険な障害です。C#の「安全でない」ブロックは、誤って使用すると危険であるため「安全でない」と命名しました。かわいいものではなく、誤解を招く価値のある名前を付けましょう。エルビスのオペレーターを始めさせないでください。:-)
エリックリッパー

26
@EricLippert:「短絡」は一般の人には怖いかもしれませんが、K&Rが実際の定義について混乱しているとは思いません。電気工学では、回路の短絡は必ずしも危険な障害ではありません。実際、私たちは常に意図的にそれを行います。それは、電気に続く経路を短くすることにより、回路の不要な部分を切り取ることを意味します。
hackerb9

1
@CortAmmon:次の段落を読んでください。ユーザー定義の演算子のセマンティクスが少し異なるため、詳細については仕様を参照してください。
エリックリッパー

27

C#では、これらは すべて 論理演算子です。

int x = 0xABCD & 0xFF // x == 0xCD

&&そして、それらは短絡的であるため、||条件付き論理演算子」と呼ばれます。

bool someOtherCondition = true;
if (x == 0xEF && someOtherCondition) // someOtherCondition is not evaluated, 
                                     // because x == 0xEF is false

この用語は言語ごとに異なることに注意してください。CおよびC ++では &&||単なる論理演算子です。Javaでは、&および|Bitwise Operatorsと呼ばれますが、CおよびC ++はそれらを算術演算子として分類します。


3
はい、Microsoftは権威ですが、信頼できるドキュメントは仕様です。セクション7.12、条件付き論理演算子を参照してください。
エリックリッパー

8
話の教訓:これらの演算子が何をするかを正確に理解することは、名前について正確にするよりも重要です。
ロバートハーヴェイ

21
オペレーターが行うことに集中し、語彙に夢中にならないようにします。「有害と見なされる命名」も参照してください。
ロバートハーベイ

4
+1。質問にリストされているものはすべて、1つまたは2つの式を取り、値を評価する演算子です。形容詞は不必要な毛の分割です。
Blrfl


-2

ポイントは&and |ビット単位の演算子であるということです。つまり、ビット文字列値に適用され、ビット文字列値が生成されます。そして、ビットワイズはプログラマーの間で非常によく使われる用語です。

たとえば0xff & 0x00 == 0x00、while 0xff | 0x00 == 0xff

そして&&and ||は条件に適用され、条件の通常の値を生成します。すなわちtrueおよびfalse

たとえばtrue && false == false、while true || false == true

したがって&&、プログラマーの間では通常の用語ではありませんが、条件演算子||と呼ばれる可能性があります。

もちろん、すべてのC、C ++、Java、およびC#プログラマーはそれをすべて知っています。しかし、「条件演算子」は私たちプログラマーが頻繁に使用する用語ではないため、誤解が生じていると思います。


5
もちろん、すべてのC、C ++、Java、C#プログラマーはそれをすべて知っています。これは非常に無作法なことで、OPがバカなことを意味します。プログラマーに書い同じように、OPを除外します。しないでください。
ダークダスト

1
Eric Lippertの受け入れられた答えの後にあなたの後で答えが付加価値をもたらすとは思わないし、さらに質問のポイントを理解しないという意味で間違っています。
ホンザジデク

@DarkDustすべてのC、C ++、Java、およびC#プログラマーは、これらの演算子を理解する必要があります。これは失礼ではなく事実です。
Phil1970

1
@ Phil1970:OPはこれらの演算子を理解しているように見えますが、それは命名の明確化に関するものです。この観点から、ヒルトンの答えに関連する用語を強調したため、彼の文章は、すべてのプログラマーがこれらの命名の詳細について知っていることを意味すると解釈できますが、そうではありません。これ間違っており(他の回答の議論で見られるように)、その言い回しは失礼です。
ダークダスト

4
親愛なる皆さん、私の答えが失礼に思えたなら、すみません。英語は第一言語ではありません。いずれにせよ、私はOPがプログラマーではないことを意味するつもりはありませんでした。反対に、私は彼または彼女が読んだテキストの珍しい命名に混乱していることを意味しました。私がやろうとしたことは、プログラムの断片による異常な命名を明確にすることだけでした。
ヒルトンフェルナンデス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.