27

間隔の違いが単項演算子にどのように影響するかを誰かに説明してもらえますか?

int i = 1;
int j = i+ + +i; // this will print j=2
int k = i++ +i; // this will print k=3
int l = i+++i; // this will print l=3
int m = i++++i; // compile time error

.

4

2 に答える 2

43

まず、これを相互作用できない 3 つのケースに分けてみましょう。

int i = 1;
System.out.println(i+ + +i); // 2

int j = 1;
System.out.println(j++ +j); // 3

int k = 1;
System.out.println(k+++k); // 3

それでは、括弧を使用してそれらを書き直してみましょう。

int i = 1;
System.out.println(i + (+(+i)));

int j = 1;
System.out.println((j++) + j);

int k = 1;
System.out.println((k++) + k);

最初の操作

ここでは、どこにもトークンがないため、前置または後置 ++ 演算子を使用できません。++代わりに、2 項 + 演算子と 2 つの単項 + 演算子があります。

2回目の手術

これは単純です: 後置 ++ 演算子の後に 2 項 + 演算子が続きます (単項 + 演算子で+jはありません)。

3回目の操作

(k++) + k最終行はではなくとして解析されk + (++k)ます。この状況では、どちらも実際には同じ答えを返しますが、代わりに 2 つの異なる変数を使用することで、どちらがどちらであるかを証明できます。

int k1 = 1;
int k2 = 1;
System.out.println(k1+++k2); // Prints 2
System.out.println(k1); // Prints 2
System.out.println(k2); // Prints 1

ご覧のとおり、k1ではなく がインクリメントされていますk2

が、、のk+++kトークンとして解析される理由は、以下を含むJLS のセクション 3.2によるものです。k+++k

結果が最終的に正しいプログラムを作成し、別の字句変換が作成される場合でも、各ステップで可能な限り長い翻訳が使用されます。

4 回目の操作 (コンパイルの失敗)

同じ「可能な限り長い変換」ルールは、 , ,i++++iとして解析されますが、これは有効な式ではありません (操作の結果は変数ではなく値であるため)。i++++i++

于 2014-02-25T09:43:21.853 に答える
13

+は演算子であり++、演算子ですが、+ +そうではありません -は1 つではなく+ +2 つの として解釈されます。したがって、スペースにより、コードが異なる方法で解釈されます。+++

+は、2 つの数値を加算する二項演算子と、数値を変更しない単項演算子の両方です (単項演算子との一貫性のためにのみ存在し-ます)。

addbinary+no-change代わりに unary の代わり+increment使用すると++、より明確になる可能性があります。

int j=i+ + +iになりint j = i add no-change no-change i;ます。
int k=i++ +i;になりint k=i increment add i;ます。
int k = i+++i;なるとint k = i increment add i;思いますが、言語仕様で確認していません。

于 2014-02-25T09:35:39.123 に答える