19

C#/Java の両方で、isそれぞれの演算子の優先順位によりinstanceof、醜い必要な括弧が発生します。たとえば、書く代わりに、書くif (!bar instanceof Foo)必要がありますif (!(bar instanceof Foo))

では、なぜ言語チーム!は is/instanceof よりも演算子の優先順位が高いと判断したのでしょうか? 確かに C# では、状況によっては別の結果につながる上書きが可能ですがoperator!、そのような状況は非常にまれなようです (いずれにせよ直観的ではありません)。可能性が高くなります。

4

9 に答える 9

11

これは、信頼できる情報源のない問題に関する私の考えです。

instanceof非常に大きなオペレーターです。ほとんどの演算子は最大 2 文字です。さらに、instanceofそれと変数の間に空白が必要です。!bar instanceof Fooこの 2 つのユニークな点のために、 のような式を見ると、instanceofと が自然に分離しているように見え、 が部分式でないと驚く人が多いでしょう。!barFoo!bar

同様の考え方を にも適用できますがis、Java が既に行ったことに従うという追加の引数が必要です。

于 2013-08-23T00:40:40.107 に答える
11

陰謀論:

C# の設計者は、 operatorを使用することを望んでいませんis。この演算子の使用は、多くの場合、悪い OOP 設計の匂いがします。頻繁に使用している場合は、おそらくクラス階層が間違っていて、仮想メソッドとパターンに大きく依存する必要があることを意味します。Java 設計者はさらに先へ進みました。彼らは、instanceof使用するたびにうんざりするようなオペレーターに名前を付けました。

これは実際にはありそうもないことです。言語やライブラリの設計者が一部の機能を使いにくくするケースはよくあります。いくつかの例: .NET の文字エンコーディング (常に Unicode を使用する必要があります)、gotoPascal の文字エンコーディング (避けるべきです) など。設計の悪さ (.NET の WPF など) が原因である場合もありますが、意図的な場合もあります。

于 2013-09-03T14:24:45.743 に答える
1
  1. instanceof+やのような基本的な演算子に比べて非常に長い単語++です。状態を読むと、集中力が失われます。少なくとも私はそうです。
  2. 読みやすさを向上させることができるスペースで囲まれていますが、一方で、他のオペランドと接続すること5+6はできません。

私はみんながこう言うことにしたと信じています: OK、優先度を下げるので、何が起こっているのかを確認するために全員が括弧を付けなければなりません

于 2013-09-04T06:06:29.560 に答える
1

明らかに、!b instanceof SomeType(read: "negate b, then check if the results value is of Type SomeType") のような式は、Java ではあまり意味がありません。

論理的にbは、ある種のブール オブジェクトである必要があり (それが!機能するように)、その値を否定したとしても、以前と同じ型のブール値のままになるので、なぜそもそも否定する必要があるのでしょうか?

(実際には、それを行うことさえできません。実際の である必要があるためb、 a にすることはできませんが、が a の場合でも、まだプリミティブに評価されるため、機能しません。)booleaninstanceofObjectbBoolean!bbooleaninstanceof

!b instanceof SomeTypeしたがって、Java ではセマンティックな意味はまったくないと言えます。したがって、その意味を「b型ではないかどうかを確認する」に再割り当てできSomeTypeます-できませんか?

これが意味的に変更された可能性があり、まだ行われていないことを考えると、これは実際には意図的ではなかったという結論になりますが、 の優先順位を低くするより実用的な理由がありましたinstanceof

instanceof頭のてっぺんから、単項演算子よりも高い優先順位を与えると、解析が複雑になるのではないかと思います!。あなたはそれを確認したいかもしれません。

一方、 ifは「が型ではない!b instanceof SomeTypeかどうかを確認する」ことを意味しますが、初心者のプログラマーは、実際には の結果を否定するときに で動作するように思わせる可能性があるため、本質的に未定義のままにしておく方が曖昧ではありません。bSomeType!binstanceof!b instanceof SomeType

于 2013-09-08T17:56:32.680 に答える
0

C プログラミング言語が間違っていたため、Java は盲目的に C に従いました。

Cでは、!と ~ は同じ優先順位です。!(a>=b) ではなく a<b と書くので、C では実際にはあまり問題になりません。

しかし、notinstanceof 演算子はありません。

また、なぜ /* /* */ */ が適切にネストされないのかと尋ねるかもしれません。または、Java が 0 からカウントする理由。または、void キーワードが必要な理由。または、Java が endif (または fi) の代わりに恐ろしい {{}{}} 表記を使用する理由。それはすべてCの遺産です。

そしておそらく正当な理由があります。C プログラマーは、慣れ親しんでいるため、これらすべてが正しいアプローチであると主張します。Java の最初の仕事は、他の多くの忘れ去られたプログラミング言語とは異なり、注目され、使用されるようになることでした。

Java には null で終了する文字列がないことに感謝してください。

于 2016-07-29T06:49:55.143 に答える