1

次のようなコードがあるとします。

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

出力は3つになり、それが私の質問です。Javaは、最初に行全体を読み取り、事前命令を事後命令から分離するのではなく、次のように扱います。

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

...左から右に読むだけですか?それとも、コンパイラに依存しており、依存すべきではありませんか?

4

2 に答える 2

3
k++ * ++k

左から右に評価されます。

説明:

  • k++: 最初に k の元の値 (1) を使用します。
  • その後 k をインクリメントすると、k は 2 になります。
  • ++k: 最初に k をインクリメントしてから使用します。したがって、k は現在 3 です。

k の初期値が 1 の場合、次のk++ * ++kようになります1 * 3。結果は 3 です。

サブ式の副作用は Java で明確に定義されているため、この式は Java で有効であることに注意してください。like 式k++ * ++kは、C または C++ で未定義の動作を引き起こします。したがって、一般的にそのような表現は避けてください ;)

于 2012-12-19T18:12:40.173 に答える
2

これは、言語仕様によってオペレーターごとに定義されます。最初の例の場合、演算子のルールはJLS15.17*で定義されています。

乗法演算子は同じ優先順位を持ち、構文的に左結合性です(左から右にグループ化されます)。

于 2012-12-19T18:08:34.793 に答える