ほとんどのプログラミング言語に '!>'(より大きくない)および '!<'(より小さくない)演算子がない理由はありますか?


28

何か理由があるのか​​、それとも単なる歴史の偶然なのか、ほとんどのプログラミング言語には演算子!>!<演算子がないのだろうか?

a >= b (大きいOR Bに等しい)のように書くことができた!(a < b) (より少ないNOT b)に等しくなります、a !< b

この質問は、私が自分の式ツリービルダーをコーディングしている最中に思いつきました。ほとんどのプログラミング言語は持っていないa != bためにオペレータを!(a=b)、なぜ何!>!<

更新:

  • !<(ないより少ない)で発音しやすくより>=(大きいまたは等しいです)
  • !<(ないより少ない)で入力するより短いより>=(大きいまたは等しいです)
  • !<(以上ではない)理解するの簡単です>=(以上)

* OR2つのオペランド(grater、equals)を操作するために必要なバイナリ演算子であるのに対しNOT、単項演算子であり、1つのオペランド(より小さい)でのみ操作する必要があるためです。


3
それはだていないすべての言語で発音することは必ずしも容易になります。たとえば、ドイツ語では「größer/ gleich」と言いますが、「nicht kleiner」は聞いたことがありません。
インゴ

1
簡単に理解するための引数は、どちらかの水を保持していません。どちらの場合も2つのオペランドを操作する必要があります。これは関係演算子では通常のことです。また、あなたは単にあなたが持っている脳は、オペランドの代わりに2ドの1に容易に操作できることを前提といかなる神経科学の分野から、そのための証拠を?
インゴ

回答:


84

Dプログラミング言語DMCの拡張 CおよびC ++には、これらの事業者は(それらのすべての14の組み合わせ)をサポートしていましたが、興味深いことに、Dは、これらの演算子を廃止しようとしている主な理由は、

  1. 正確にはa !< b何ですか?ですa>=b || isNaN(a) || isNaN(b)!<はないと同じ>=ので、NaN !< NaN真しばらくはNaN >= NaNfalseです。IEEE 754 を習得するのは難しいので、a !< btoを使用するとNaNの処理に混乱が生じるだけです。Phobos(Dの標準ライブラリ)でそのような演算子を検索できます。
  2. したがって、たとえDのような演算子が存在していても、それを使用する人はほとんどいません。
  3. また、これらのめったに使用されない演算子に対してさらに8個のトークンを定義する必要があります。
  4. そして、これらの演算子がなくても、同等のを使用することもでき!(a < b)ます。明示的a >= b || isNaN(a) || isNaN(b)にしたい場合は、読みやすくします。

また、関係(≮、≯、≰、≱)は、!=(≠)や>=(≥)とは異なり、基本的な数学ではめったに見られないため、多くの人々にとって理解するのは困難です。

これらはおそらく、ほとんどの言語がそれらをサポートしない理由でもあります。


seldomly seen in basic math-より多くの、見たことがない。私達はちょうど数学的に等価1(特に以来にそれを反転して戻っ代数で学ぶNaN基本的な数学には表示されません)
Izkata

私見で本当に必要なのは、その振る舞いdouble を除いて振る舞う変数を宣言する手段ですNaN。多くのケースでは、との比較のいずれかの種類を実行する可能性のあるコードをNaN持っていることになるでしょうNaNすべてのものより大きいの比較、それはすべてのものよりも小さい比較したり、比較の試みに例外をスローしています。コードが宣言NaNすべき方法を宣言するように指定できるようにすると、正しい動作を実現するために命令型コードを使用する必要性が減ります。
supercat 14

@supercat:<fenv.h>などの関数を使用して、NaN操作で例外をスローできfesetexceptflagます。
ケニー14

@KennyTM:操作を実行する前にフラグを設定し、その後設定を解除しなければならないことは、厄介でトラブルを起こしやすいように思われます。また、完全な順序を課したいという可能性に対処していません。私が理解しているものからのIEEEは、完全な順序を課すいくつかの新しい比較方法を導入しました。言語がどのように反応するかを見るのは興味深いでしょう。
supercat 14

47

まったく同じ意味を持つ2つの異なる演算子を持つことはあまり意味がないためです。

  • 「大きくない」(!>)は「以下」とまったく同じです(<=
  • 「小さくない」(!<)は「より大きいか等しい」(>=)とまったく同じ

これは「等しくない」(!=)には適用されません。同じ意味の演算子はありません。

したがって、変更を加えると、言語はより複雑になり、メリットはありません。


5
どの程度x = x + 1x += 1x++

33
@dunsmoreb:それらはどれも同じものではありません。「増分」の目的を果たすのは1つだけです。同じ目的を果たすために他の2つの式を活用したという事実は無関係です。どちらもはるかに一般的です。
-DeadMG

1
<>!=はと同じ意味を持つ演算子で、Python 2には両方があります。
-krlmlr

9
@ user946850そして、両方を持つことは間違いと広く見なされ<>ており、使用は長い間廃止されており、3.0から削除されています(そして、あなたは、これまでの 2.xリリース2。7、2010年夏にリリースされました)。

3
@svick ++演算子をさらに素晴らしいものにします。C#プログラマーがここに来ないようにし、プログラムの動作について合理的な仮定を立ててから、C ++プログラマーの仕事を盗みます。

10

!<はと同義>=です。後は、明確に定義された数学記号を入力する方法です。話されている言語で「より小さくない」が使用されていることは正しいですが、口語的であいまいな場合があります(解釈または誤解される可能性があります>)。一方、プログラミングと数学では、明確に定義された明確な用語を使用します。

ANSI SQLなどの3値ロジックでも、not x < yはどちらかまたはである場合x >= yに両方とも与えられるため、と同等です。ただし、ANSIに準拠していないSQL方言がありますが、同等ではありませんNULLxyNULL!<


10
ただし、浮動小数点数を使用する場合、通常は同等ではありません。たとえば、との比較NaNはfalse です。そのため!(2 < NaN) == true、while (2 >= NaN) == falseです。
ハンマー

@hammar:本当ですが、それはNaNsの周りのすべての算術関係にも当てはまります。それらはすべて正常に動作しなくなります。
ニコルボーラス

@hammar-これは浮動小数点の障害であり、Ordを正しく実装していないだけです。それにもかかわらず、これは大きな問題ではありません。誰も私たちに実装を強いるわけではないので、a !< b = not (a < b)(!<)=(> =)とだけ言うことができます。
インゴ

8

Transact-SQLには!>(より大きくない)および!<(より小さくない)演算子があります。

それで、あなた以外で、Sybase Microsoftの誰かもそれが良い考えだと思いました。Microsoft Bobのように!:)


これはv 2005で追加されていませんか?
-JeffO

5
この世界には、お互いに同意するだけでなく、コンセンサス!=正確さの、狂気で賢明でない人がたくさんいます。

@JeffOでは、SybaseではなくMicrosoftを非難すべきでしょうか?
ヤニス

面白い。私はこの背後にある物語に興味があります。
surfasb

@surfasbうん、私も。私の推測では、それは単なる構文上の砂糖であり、特別なものではないでしょう。
ヤニス

4

答えは、単に!<オペレーターは必要ないということだと思います。あなたは、あなたの質問に指摘したようにそこに既にある>=<=既存の式を否定する可能性とともに、なぜ別のオペレータを追加しますか?


同じことをする演算子を追加しても意味がないことに同意しますが、「彼ら」が!<ではなく> =を選んだ理由は、NOT LESSER、GREATER OR EQUALSの発音がはるかに簡単で、入力が簡単で、理解する脳。
アレックスBurtsev

!<入力するよりも短くない>=、または何かが欠けていますか?
ブライアンオークリー

私はそれがテキスト表現(発音されたテキスト)であることを意味しました。
アレックスBurtsev

4

RFC 1925から

追加するものが何も残っていないときではなく、奪うものが残っていないとき、完璧に達しました。

既存の機能を複製する追加の演算子を追加しても、言語(およびトークナイザーとパーサー)に(不必要な)複雑さを追加する以外は何もしません。

また、演算子のオーバーロードが可能な言語では、さらに別の演算子をオーバーロードする必要があります。際の混乱を考えてみましょうbool operator<=bool operator!>(はい、私は1つが既に矛盾比較を行うことができます知っている)異なるものを返すことができます。

最後に、メソッドまたは演算子が複数定義されている言語(Ruby-私はあなたを見ている)を考えてみてください。あるプログラマが<=を使用し、別のプログラマが!>を使用し、同じ式に対して複数のコードスタイルがあります。


はい!これが科学的節約の原則です。
luser droog

3

すべての言語が最初に正の演算子を実装し、次に負の演算子にアプローチするため、2番目のものが最初ではないのはなぜですか?そして、それらは冗長であると思い、それらをスキップします。

常にポジティブなケースを最初に実装してから、ネガティブなケースに進んでください(:)ポジティブ思考、私個人の見解のみ)


2

理由は、プログラミング言語の演算子は数学の伝統から借用し、数学では「小さくない」と「小さくない」が同じように働くので、誰も「大きくない」と「小さくない」を使用するからです。

したがって、プログラミング言語では通常、等しくないために≠のように見えるシンボルを取得します(!=または/=、誰かが空想<>またはテキスト演算子でない限り)

および≤および≥(<=および>=)のように見えるもの


ところで、私はあなたの主張に同意しません。それは理解するのがより簡単であり、ORについては推論するということです。数学では、多くの否定(不合理な還元など)を伴う証明は、より直接的な代替手段がある場合、通常は眉をひそめます。また、順序付けの場合、私たちが持っている(そして何かを考えたり証明するときに使われる)基本的な知識は、<、=、>の間の三分法なので、!<ステートメントは、おそらく> =それに役立つもの。


2

アセンブリ命令セットを部分的に非難します。jge「以上の場合はジャンプ」などの指示があります。「より小さくない場合はジャンプ」とは対照的。

コンパイラライターは、アセンブリライターが思いついたものから脱却した可能性があります。これは、おそらくチップ上で設計されたときにラベルが付けられた方法に基づいていました。

...おそらく。


1

数年前に、!=演算子(等しくない)の代わりに、次のようなもの<>が使用されていた言語を見たと思います。しかし、彼らの名前を思い出せません...

私はそれを読むのが困難だと思います!(a < b)a !< bよりもa >= b。おそらく!<それが使用されない理由です(私の意見では見苦しいです)。


1
<>主にBASIC方言、SQL、およびPascal方言で使用されます(だった?)。
ヤニス

@Yannis Rizosに感謝します。彼らは高校で私たちにパスカルを教えてくれました。
ラドゥマーゼア

2
パイソン2も有し<>、それが3で除去したものの、
ダニエルLubarov

論理的な観点から見ると、!=がより一般的です<>。なぜなら、等式は明確に定義されているものの、実際には有用な順序が存在しないもの(複素数など)を持つことができるからです。
デビッドソーンリー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.