間隔の違いが単項演算子にどのように影響するかを誰かに説明してもらえますか?
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
.
間隔の違いが単項演算子にどのように影響するかを誰かに説明してもらえますか?
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
.
まず、これを相互作用できない 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 項 + 演算子が続きます (単項 + 演算子で+j
はありません)。
(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
結果が最終的に正しいプログラムを作成し、別の字句変換が作成される場合でも、各ステップで可能な限り長い翻訳が使用されます。
同じ「可能な限り長い変換」ルールは、 , ,i++++i
として解析されますが、これは有効な式ではありません (操作の結果は変数ではなく値であるため)。i
++
++
i
++
+
は演算子であり++
、演算子ですが、+ +
そうではありません -は1 つではなく+ +
2 つの として解釈されます。したがって、スペースにより、コードが異なる方法で解釈されます。+
++
+
は、2 つの数値を加算する二項演算子と、数値を変更しない単項演算子の両方です (単項演算子との一貫性のためにのみ存在し-
ます)。
add
binary+
の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;
思いますが、言語仕様で確認していません。