インクリメントと評価順序のコードトレース

++と--は変数を一つ増減する演算子です。前置と後置は更新後の変数の値だけでなく、式がその場で返す値に違いがあります。評価する順序と、演算の優先順位を分けて追います。

この単元で学ぶこと

  • 前置と後置の式の値を区別する
  • 左から右への評価と優先順位を区別する
  • 更新先として使える変数を判定する

本文解説

更新前の値を保持する int n=4;System.out.print(n++);System.out.print(":"+n);は4:5です。最初のprintに渡す値は4ですが、二番目のprintまでにnは5です。呼出し先が表示した値と、呼出し後の変数の状態を混同しないようにします。

前置と後置の混在 int n=1;int x=++n+n++;では前置がnを2にして2を返し、後置が2を返してnを3にします。xは4です。演算子の位置を見落とすと5と誤答しやすいため、各項の式の値を先に書き出します。

代入による上書き int n=5;n=n++;では右辺の後置式は5を返してnを6にしますが、その後代入が5をnへ格納します。最終的なnは5です。増分が消えるのではなく、後続の代入により更新結果を上書きしています。

減分と負数 int n=0;int x=n-- - --n;では左は0、nは-1、右はさらに減った-2です。0-(-2)=2なのでxは2、nは-2です。二つの--と二項の-を切り分け、負の数の減算として計算します。

複合代入の左値保存 int n=3;n+=n++;では左側の元の3を保持し、右の後置式も3を返します。加算した6を最後にnへ格納します。右側でnが4になっても左側の保存値が4に読み直されるわけではありません。

配列添字の副作用 int[] a={10,20};int i=0;a[i++]+=5;では添字0を選びiを1にして、a[0]を15へ更新します。複合代入の左辺を二回評価してa[1]を更新するわけではありません。配列のどの要素を選んだかとiの最終値を別々に追います。

文字と小数の増分 char c='A';c++;は文字コードが一つ増えてBです。double d=1.5;d++;は2.5です。++は整数専用ではなく数値変数に使えますが、String s="1";s++;は文字列を数値に変換して更新する演算ではありません。

短絡と副作用 int n=0;boolean b=false&&++n>0;では右辺を評価せずnは0です。true||++n>0も同様です。増分がソースに書かれていても、その式が評価される経路にあるとは限りません。実務では副作用を独立した文へ分けると追跡しやすくなります。

図解

後置と前置を二つの欄で追う
式の値と更新後の変数を別々に記録する。

重要ポイント

  • 前置++は更新後、後置++は更新前の値を式の値とする。
  • 単独文なら前置も後置も一つ増える。
  • 二項演算子の左オペランドを先に評価する。
  • ++は値を格納できる数値変数へ適用する。

間違えやすい点

  • 後置++の更新を次の文まで遅らせない。
  • 優先順位が高い演算子のある右側からすべて評価すると考えない。
  • 複雑な副作用入り式を実務コードで多用しない。

用語解説

前置
++nのように演算子を変数の前へ置き、更新後の値を返す形式。
後置
n++のように演算子を後へ置き、更新前の値を返す形式。
副作用
式の値を求めることに加え、変数等の状態を変えること。
オペランド
演算子が処理する対象の式。

関連教材

参考資料

教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。

確認問題の出題・採点や学習履歴の保存にはログインが必要です。