Java | インクリメント・デクリメント演算子

Java Java
スポンサーリンク

Javaのインクリメント・デクリメント演算子

はじめて触れると少し紛らわしいけれど、慣れるととても便利な記法です。ここでは、考え方をゆっくりかみ砕いて、つまずきやすいポイントを例題で丁寧に説明します。


基本の意味と使える場所

  • インクリメント(++): 変数の値を1だけ増やす
  • デクリメント(--): 変数の値を1だけ減らす
  • 使える対象: 変数に対してのみ使える(数値の直書きや計算結果には使えない)
int a = 5;
a++;     // aは6になる
a--;     // aは5に戻る

// これはダメ(コンパイルエラー)
// 5++;
// (a + 1)++;
Java
  • 省略との違い: a = a + 1;a++; は同じ意味。ただし ++ のほうが短く読みやすい。

前置と後置の違い(超重要)

インクリメント/デクリメントには「前置」「後置」があります。増減のタイミングが違うので、代入や式の中で使うと結果が変わります。

  • 後置(a++ / a--): 先に「元の値を使う」、その後で増減する
  • 前置(++a / --a): 先に増減してから、その新しい値を使う
int a = 5;

// 後置の例
int x = a++;   // xには5が入る(元の値)、処理後にaは6になる

// 前置の例
int y = ++a;   // 先にaが7になる、その7がyに入る
Java
  • つまずきポイント: 「式の評価時点で何が起きるか」を意識する。代入の右側やメソッド呼び出しの引数で使うと差が出る。

ループでのよくある使い方

ループでは「カウンタを1ずつ動かす」場面が多く、++-- が頻出です。

// 0, 1, 2, 3, 4 と出力
for (int i = 0; i < 5; i++) {
    System.out.println(i);
}

// 5, 4, 3, 2, 1 と出力
for (int j = 5; j > 0; j--) {
    System.out.println(j);
}
Java
  • ポイント: i++ は毎回1だけ増える。j-- は毎回1だけ減る。
  • 前置/後置はどっちでもいい? for文の「更新部分(第3式)」では通常どちらでもOK(i++++i で違いは生まれない)。式の中で使うときは違いが出るので注意。

例題で理解を固める

例題1:前置と後置の結果

int a = 3;
int b = a++;   // ここでbは? aは?
int c = ++a;   // ここでcは? aは?
System.out.println(a + ", " + b + ", " + c);
Java
  • 考え方:
    • b = a++ は「bに3が入り、その後aが4になる」
    • c = ++a は「先にaが5になり、その5がcに入る」
  • 出力: 5, 3, 5

例題2:式の中で使う

int x = 10;
int y = x++ + 5;   // yは?
int z = ++x + 5;   // zは?
System.out.println("x=" + x + ", y=" + y + ", z=" + z);
Java
  • 考え方:
    • y = 10 + 5 = 15(計算後にxは11)
    • z = 先にxが12になり、12 + 5 = 17
  • 出力: x=12, y=15, z=17

例題3:配列の走査

int[] nums = {2, 4, 6};
int i = 0;

System.out.println(nums[i++]);  // 2(その後i=1)
System.out.println(nums[++i]);  // 2行目後にi=1、ここで先にi=2、nums[2]=6
Java
  • ポイント: インデックスに前置/後置を混ぜると読みづらくなる。初心者は一旦分けて書くと安全。
int i = 0;
System.out.println(nums[i]); i++;
i++;
System.out.println(nums[i]);
Java

例題4:whileループでのカウンタ

int count = 0;
while (count < 3) {
    System.out.println("count=" + count);
    count++;  // これがないと無限ループ
}
Java
  • 注意: 増減を忘れると条件が変わらず、無限ループになる。

よくある落とし穴と回避策

  • 同じ式の中で複数回インクリメントしない: 読みづらく、バグのもと。
int a = 1;
// 悪い例(何が起きるか一目で分からない)
int r = a++ + ++a;
Java
  • 配列やインデックスでの濫用を避ける: 読みやすさ重視で、段階を分ける。
  • 副作用に敏感になる: ++/-- は値を返す「式」であり同時に変数を書き換える「副作用」を持つ。式の評価順序を意識する。
  • longやfloatなどの型でも動くが、キャストやオーバーフローに注意: 例えば byteshort は内部的に int で計算されるため、場面によってはキャストが必要になる。

練習問題(解答つき)

練習1:結果を当てる

int a = 4;
int b = a-- + 2;  // ?
int c = --a + 2;  // ?
System.out.println("a=" + a + ", b=" + b + ", c=" + c);
Java
  • 解答:
    • b = 4 + 2 = 6(その後aは3)
    • c = 先にaが2になり、2 + 2 = 4
    • 出力: a=2, b=6, c=4

練習2:for文を書き換える

次のfor文と同じ動作を、while で書き換えてください。

for (int i = 1; i <= 3; i++) {
    System.out.println(i);
}
Java
  • 解答例:
int i = 1;
while (i <= 3) {
    System.out.println(i);
    i++;  // 忘れずに増やす
}
Java

練習3:安全なインデックス操作

配列 {10, 20, 30, 40} を先頭から順に出力してください。i++ を使っても構いませんが、読みやすさを優先してください。

  • 解答例:
int[] arr = {10, 20, 30, 40};
for (int i = 0; i < arr.length; i++) {
    System.out.println(arr[i]);
}
Java

まとめと実践のコツ

  • 意味の整理: ++ は「1増」、-- は「1減」。前置は先に変える、後置は後で変える。
  • 安全第一: 代入や式の中での前置/後置は結果が変わる。読みづらくなる場合は分けて書く。
  • 実践: ループの更新、カウンタ、配列走査で使いこなす。まずは for と while で自然に使えるように練習する。
タイトルとURLをコピーしました