11

みたいな簡単な表現

(x) - y

xが型名であるかどうかによって解釈が異なります。xが型名でない場合は、から(x) - y減算するだけです。ただし、が型名の場合は、の否定を計算し、結果の値を type にキャストします。yxx(x) - yyx

典型的な C または C++ コンパイラではx、パーサーが typedef または struct 宣言を処理するとすぐにそのような情報をレクサーに伝達するため、 が型であるかどうかという問題に答えることができます。(このように必要なレベル違反は、C の設計の最も厄介な部分だったと思います。)

ただし、Java ではx、ソース コードの後半まで定義されない場合があります。Javaコンパイラはどのようにしてそのような式を明確にしますか?

Java は使用前の宣言を必要としないため、Java コンパイラーが複数のパスを必要とすることは明らかです。しかし、これは、最初のパスで式の解析に関して非常に雑な仕事をし、その後のパスで別のより正確な式の解析を行う必要があることを暗示しているようです。それは無駄に思えます。

より良い方法はありますか?

4

2 に答える 2

8

私は私を満足させる解決策を見つけたと思います。mmyers のおかげで、型キャストの構文の正式な仕様を確認する必要があることに気付きました。

あいまいさは、単項演算子と二項演算子の両方によって引き起こされ+ます。-Java は次の文法で問題を解決します。

CastExpression:
        ( PrimitiveType Dimsopt ) UnaryExpression
        ( ReferenceType ) UnaryExpressionNotPlusMinus

( http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#238146を参照)

そのため、キャストがプリミティブ型を使用しない限り、キャストの直後は明示的に禁止さ'+'れています。これは、コンパイラによってアプリオリに認識されています。'-'')'

于 2008-12-30T18:22:34.190 に答える
2

私はちょうどそれをテストしました、そしてこのコード:

Double y = new Double(0.1);
System.out.println((Double)-y);

コンパイルエラーが発生します:

operator - cannot be applied to Double, java.lang.Double.

-y を括弧で囲むと、正常にコンパイルされます。したがって、明らかに Java はこの問題を単に文法で許可しないことで解決しています (それが正しい用語である場合、私はコンパイラの専門家ではありません)。

于 2008-12-30T17:32:41.763 に答える