web-dev-qa-db-ja.com

==が標準の等価演算子である理由

私がこれまでに使用したすべてのプログラミング言語では、数学的な同等性をテストするためのコンパレータは==です。たとえば、pythonの場合:

if 7 == 8 - 1:

なぜ私の知る限り、すべてのプログラミング言語がこのように設計されているのですか? =記号を1つだけ持つことは、それほど意味がありませんか? =は、次のように変数値の定義と割り当てに使用されることを理解しています

foo = bar

しかし、コンパイラーは確かにifステートメント(その前にタグ付けされたifから)および変数の割り当て(その前にタグ付けされたiflackのため)と区別できますか? FORTRAN日までさかのぼる傾向ですか?なぜ変更されていないのですか?

正直なところ、==演算子を2つの異なる方法ではなく2つの異なる方法で使用する計算能力がある場合、=の代わりに=を使用する論理的な理由がわかりません。演算子。ささいなコンパイラエラーが発生するのはうんざりです-この愚かな慣例を誰が考えたのですか?

8
blaizor

この質問はStackoverflowサイトに移動される可能性があると思いますが、興味深い質問です。

この背後にある理由は、Fortranが "="を使用して1つの変数から別の変数に値を割り当てるという概念を導入したためです。これにより、等価演算子として何を使用するかについて多くの混乱が生じました。これを引用するには wikipediaの記事

等号の比較としての等号との競合のため、等号=を代入演算子として使用することは頻繁に批判されています。これは、初心者がコードを書くときの混乱と、経験豊富なプログラマがコードを読むときの混乱の両方を引き起こします。等号の割り当てへの使用は、1949年から1951年に設計され、Fortranによって特に普及した、ハインツルティスハウザーの言語スーパープランにさかのぼります。

悪い考えの悪名高い例は、割り当てを示す等号の選択でした。それは1957年にFortranに遡り[a]、言語デザイナーの軍隊によって盲目的にコピーされました。なぜそれが悪い考えなのですか? 「=」が等しいかどうかの比較を示すようにすることは、100年前の伝統を覆すため、真または偽のいずれかの述語です。しかし、Fortranはそれを割り当て、つまり平等の強制を意味するようにしました。この場合、オペランドの足場は等しくありません。左のオペランド(変数)は、右のオペランド(式)と等しくなります。 x = yは、y = xと同じ意味ではありません。

Niklaus Wirth、鏡を通して見る良いアイデア*

これが==を比較演算子として使用するまでの経緯を以下に示します このウィキペディアの記事

初期のFORTRAN(1956–57)は、「=」が利用可能な唯一の関係演算子である、非常に制限された文字セットによって制限されていました。 "<"や ">"はありませんでした(そして確かに≤や≥はありませんでした)。これにより、設計者は.GT。、。LT。、。GE。、。EQなどの記号を定義する必要がありました。など、その後、残りの「=」文字をコピーに使用するのは魅力的ですが、数学的な使用法と明らかに矛盾している(X = X + 1は不可能であるべきです)。

International Algebraic Language and ALGOL(1958 and 1960)したがって、割り当てに「:=」を導入し、標準「=」を同等に使用できるようにしました。CPL、ALGOL W、BCPL、Simula、ALGOL 68、SETL、Pascal、Smalltalkが後に続く規約です。 、Modula2、Ada、Standard ML、OCaml、Eiffel、Delphi、Oberon、Dylan、VHDL、およびその他のいくつかの言語。

一方、現在非常に影響力のある言語Cは、Bと呼ばれる最小限のコンパイル済み言語として始まり、次に、BCPLの簡易バージョン(CPLの型なしバージョン)として始まりました。 Bの意図されたアプリケーションは、(当時は非常に原始的な)UNIXの最初のポートの手段としてのみでした。 「ストリップダウン」プロセスとして記述されているものでは、BはBCPLの元の「:=」と「=」をそれぞれ「=」と「==に置き換えました。これの理由不明であること(および/またはその間、それぞれ「&」と「|」、後に「&&」と「||」になった)。小規模な型システムが後に導入されたため、BはCになりました。Cの人気とUNIXとの関連により、Java、C#、およびその他の言語(Fortranの新しいバージョンを含む)は、構文的には、この不必要な競合にもかかわらず、次のようになりました。等号の数学的な意味。

30
Mervin

等しいかどうかのチェックは、ifステートメントでのみ使用されません。例えば:

are_equal = foo == bar

構文で単一の等号を使用できる場合、そのような割り当てはあいまいになります。

are_equal = foo = bar

これは、「foobarを比較して、その結果をare_equal "、または" bar値を両方に割り当てるare_equalおよびfoo "。

5
megapctr