今日は筆記試験の問題がありました。まず問題を見てみましょう。
public class Demo1011 {
public static void main(String[] args) {
int j = 0;
for (int i = 0; i < 10; i++) {
j = j++;
}
System.out.println(j);
}
}
問題は、プログラムの実行後の入力結果は何でしょうか?
操作結果:
驚いた表情ですか?なぜですか?
いろいろ勉強してやっとわかったのでまとめてみます。
まず j = j++ を見てみましょう。j = 0 とします。JVM
が j++ を処理するとき、まず変数 j の値をスタックにプッシュし、一時的にスタックに格納してから、変数領域の j に 1 を加えます ( j = j + 1) とすると、このときの j の値は 1 になりますが、このときの演算結果はスタックの値を返します。つまり戻り値は 0 のままです。したがって、 j++ による演算の結果(戻り値) (演算前に j = 0 の場合) は 0 のままです。j = j++ はスタック内の値を変数 j に代入しますが、j の値は 0 のままになります。
j = ++j をもう一度見てみましょう。j = 0 と仮定します。JVM
が ++j を処理するとき、最初に変数 j を 1 つインクリメントし、次にその値をスタックに置き、最後にスタック内の値を変数.領域 j なので、j の値は 1 です。
勉強で問題に出会ったら、一つ一つ解決していき、解決してしまえば問題ではなくなります。(理解しているからといって、本当に理解しているわけではありません。人に説明できて初めて、本当に理解できるのです)