インクリメントと評価順序を理解する

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

この単元で学ぶこと

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

本文解説

一つ増やす操作 int n=2;n++;はnを3に更新します。++n;も単独文なら同じ更新です。n=n+1;に近い役割ですが、byte等では暗黙の型変換の違いがあります。まずintの独立した更新文で増えることを確かめます。

後置の値 int n=2;int a=n++;ではaは2、nは3です。n++という式の値には更新前の2が使われ、n自身はその式を評価する間に3へ更新されます。後の文で初めて更新されるわけではありません。

前置の値 int n=2;int a=++n;ではnを先に3へ更新し、その3をaへ渡します。nが最終的に3になる点は後置と同じですがaが違います。aだけ、nだけのどちらを問われているかコードの表示対象を読みます。

減らす演算 int n=5;int a=n--;ではaが5、nが4です。int a=--n;ならaもnも4です。増加か減少かと、前置か後置かは別の軸です。--が付いているから式の値も常に減った後とは限りません。

左からの評価 int n=2;int a=n++ + n;では左のn++が値2を返してnを3にし、右のnが3を返すためaは5です。n++ + n++なら二つ目は3を返しnは4です。同じ変数が複数回現れる場合は各出現時の値を記録します。

優先順位との区別 int n=2;int a=n++ + n*2;では左のn++を先に評価して値2を保持します。次に右側n*2を3*2=6と計算し、合計8です。掛算が加算より優先でも、右側の変数参照を左側の副作用より先に行うわけではありません。

更新できる対象 int n=2;ではn++は合法ですが、2++や(n+1)++は値を書き戻す変数ではなく拒否されます。final int n=2;n++;も再代入の制約に反します。booleanには数値の増減という演算自体が定義されていません。

型と範囲 byte n=127;n++;はコンパイルでき、更新後は-128です。++には必要な型への変換が含まれ、範囲を超えて折り返します。byte n=127;n=n+1;は右辺がintなので別の理由で拒否されます。更新の合法性と値域を両方確認します。

図解

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

重要ポイント

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

間違えやすい点

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

用語解説

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

関連教材

参考資料

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

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