前置・後置の罠

このレッスンでできるようになることは、i++i = i++ の違いを説明でき、++ が混ざった式の結果を予測できるようになることです。

まず予測してみます

次のコードの出力を、実行する前に頭の中で決めてください。

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

6 と答えたくなりますが、正解は 5 です。試験で最も多く出る形のひとつです。

なぜ 5 のままなのか

後置インクリメント i++ は、次の順で動きます。

  1. いまの i の値 5 を、式の値として取り出す
  2. i を 6 に増やす

ここまでで i は確かに 6 です。ところが i = ... の代入がこのあとに実行され、手順 1 で取り出した 5 を i に書き戻します。増えた 6 が 5 で上書きされるので、結果は 5 です。

一方 i++; と単独で書けば代入が無いので、i は 6 になります。i = i + 1 も 6 です。つまり i = i++ だけが特別に壊れています。

前置と後置の違い

前置 ++i は先に増やしてから値を取り出します。後置 i++ は取り出してから増やします。増えるタイミングは同じで、式の値として何が返るかだけが違うと覚えてください。

int a = 1; int b = a++ + ++a;

a++ は値 1 を返して a を 2 にします。続く ++aa を 3 にしてから値 3 を返します。よって b は 4、a は 3 です。試験ではこの形が配列の添字に紛れ込みます。

int[] n = {10, 20, 30}; int k = 0; n[k] = n[k++];

左辺の添字も右辺の評価より先に決まるので、書き込まれるのは n[0] です。

実務での書き方

i = i++ は誰の役にも立たないので、実務では書きません。試験は「読めるか」を問うだけです。自分で書くときは i++i = i + 1 にそろえてください。

演習

数を数えるはずのメソッドが、いくら回しても増えません。原因はこのレッスンの罠です。直して正しい値を返してください。

要件

  1. countUp(start, times) が start + times を返すこと
  2. times が 0 のときは start をそのまま返すこと
  3. メソッドの名前と引数は変えないこと

入出力例

countUp(5, 3)"8" countUp(0, 10)"10" countUp(-2, 4)"2" countUp(7, 0)"7"

ヒント

生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア
編集 LuaGate編集部
main.java
学習モード

メモ

前置・後置の罠

⌘S で保存