インクリメントと評価順序を理解する
++と--は変数を一つ増減する演算子です。前置と後置は更新後の変数の値だけでなく、式がその場で返す値に違いがあります。評価する順序と、演算の優先順位を分けて追います。
この単元で学ぶこと
- 前置と後置の式の値を区別する
- 左から右への評価と優先順位を区別する
- 更新先として使える変数を判定する
本文解説
一つ増やす操作 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++のように演算子を後へ置き、更新前の値を返す形式。
- 副作用
- 式の値を求めることに加え、変数等の状態を変えること。
- オペランド
- 演算子が処理する対象の式。
関連教材
参考資料
教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。
確認問題の出題・採点や学習履歴の保存にはログインが必要です。