前置・後置の罠
このレッスンでできるようになることは、i++ と i = i++ の違いを説明でき、++ が混ざった式の結果を予測できるようになることです。
まず予測してみます
次のコードの出力を、実行する前に頭の中で決めてください。
int i = 5;
i = i++;
System.out.println(i);6 と答えたくなりますが、正解は 5 です。試験で最も多く出る形のひとつです。
なぜ 5 のままなのか
後置インクリメント i++ は、次の順で動きます。
- いまの
iの値 5 を、式の値として取り出す 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 にします。続く ++a は a を 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 にそろえてください。
演習
数を数えるはずのメソッドが、いくら回しても増えません。原因はこのレッスンの罠です。直して正しい値を返してください。
要件
- countUp(start, times) が start + times を返すこと
- times が 0 のときは start をそのまま返すこと
- メソッドの名前と引数は変えないこと
入出力例
countUp(5, 3) → "8"
countUp(0, 10) → "10"
countUp(-2, 4) → "2"
countUp(7, 0) → "7"ヒント
編集 LuaGate編集部