Javaが余分な空白を無視すると言われています。なぜC = A ++ + ++ bが、スペースなしでコンパイルされませんか?

ジョン・アリソン:

Javaの上のすべての書籍では、私は同じようにコンパイラに扱うことをすべての空白を読みましたし、単にそれは、コードの可読性を向上させるために自由にそれらを使用するのがベストプラクティスですが、余分な空白を無視します。私は私が書いたことをすべての式のものに証拠を見つけた:それはスペースか、そしてどのように(または多分私は注意を払っていない)、多くがあったかどうか問題ではありませんでした。

最近、私はアクションで優先順位テーブルをテストするために、オペレータの優先順位と結合して少し試しすることを決定し、コンパイルしようとしました

int a = 2;
int b = 3;    
int c = a+++b;
int d = a+++++b;

旧文が完全にコンパイルされますが、後者は例外を生成します:

スレッド「メイン」java.lang.RuntimeExceptionの例外:互換性のないソースコード - 予期しないタイプ。必須:変数。結果:値。

私はスペースを追加したときただし、: int d = a++ + ++bそれはコンパイル。なぜこのような場合でしょうか?Javaがとにかく余分な空白を無視すると言われています。(私は、Java 8とNetBeans IDE 8.2は、この問題ならば、持っています。)

私は、これは、式の解析方法とは何かを持っているかもしれないと思いますが、私はよく分かりません。私はSOの上やGoogleにいくつかの解析に関する質問、空白、および演算子を見上げてみましたが、決定的な答えを見つけることができませんでした。

UPD。それは余分な"だという意見に対処するための問題ではなく、すべての空白があること:以来int c = a++ + b;int c=a+++b;の両方のコンパイル、1がでていること、類推によって、言うことができるint d = a ++ + ++b;空白だけでなく、「余分」です。

ダニエルPryden:

Java言語仕様のセクション3.2、「字句翻訳」、(強調鉱山)言います:

生のUnicode文字ストリームがされたトークンの配列に翻訳順番に適用されている次の三つの字句変換ステップを使用して、:

  1. 翻訳のUnicodeエスケープ [...]

  2. 入力文字とのストリームへの翻訳[...] 行末 [...]。

  3. ステップ2から得られた入力文字やラインターミネータのストリームの翻訳入力要素のシーケンス空白(§3.6)とコメント(§3.7)が破棄された後、(§3.5)、含むトークン(§3.5)すなわち、構文文法(§2.3)の終端記号です。

最長可能変換が各ステップで使用されている別の語彙の翻訳を希望しながら、結果が最終的に正しいプログラムを作成していない場合でも、。

だから、空白文字は破棄されますが、「入力要素のシーケンス」の後に決定されます。セクション3.5、「入力要素とトークンは」、言います:

ホワイトスペース(§3.6)とコメント(§3.7)は、隣接する場合には、別の方法でトークン化される可能性があります、その機能はトークンを区切ることができます。例えば、ASCII文字-および=演算子を形成することができ、入力トークン- =(§3.12)ない空白やコメントが介在されている場合のみ。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=182688&siteId=1