次のようなコードがあるとします。
int k=1;
System.out.println(k++ * ++k);
出力は3つになり、それが私の質問です。Javaは、最初に行全体を読み取り、事前命令を事後命令から分離するのではなく、次のように扱います。
int k=1;
k+=1;
System.out.println(k*k);
k+=1;
...左から右に読むだけですか?それとも、コンパイラに依存しており、依存すべきではありませんか?
k++ * ++k
左から右に評価されます。
説明:
k++
: 最初に k の元の値 (1) を使用します。++k
: 最初に k をインクリメントしてから使用します。したがって、k は現在 3 です。k の初期値が 1 の場合、次のk++ * ++k
ようになります1 * 3
。結果は 3 です。
サブ式の副作用は Java で明確に定義されているため、この式は Java で有効であることに注意してください。like 式k++ * ++k
は、C または C++ で未定義の動作を引き起こします。したがって、一般的にそのような表現は避けてください ;)
これは、言語仕様によってオペレーターごとに定義されます。最初の例の場合、演算子のルールはJLS15.17*
で定義されています。
乗法演算子は同じ優先順位を持ち、構文的に左結合性です(左から右にグループ化されます)。