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

Java Java
スポンサーリンク

では プログラミング初心者向け に、Java の インクリメント(++)/デクリメント(--)演算子 を噛み砕いて、仕組みの丁寧な説明 + たっぷりの例題(解説付き) + 練習問題(解答付き) で紹介します。読みやすく段階を追って説明するので、実際に手を動かしながら確認してみてください。

1. 基本イメージ

  • ++ は「今の値を 1 増やす」演算子。
  • -- は「今の値を 1 減らす」演算子。
  • 変数にしか使えません(リテラル 5 には使えない)。
  • 数字のほかに char(文字)にも使える('A' ++'B')。boolean には使えません。

2. 前置(prefix)と後置(postfix) — 最重要ポイント

同じ ++ でも置く場所で挙動が変わります。

  • 前置 ++x:まず x1 増やす → 増やしたあとの値を「式の値」として使う。
  • 後置 x++:まず 今の値(増える前) を式の値として使う → 式の評価が終わったあとで x1 増やす

簡単に:

  • ++x = 「増やしてから使う」
  • x++ = 「使ってから増やす」

3. 具体例(逐次的に説明)

単純に変数だけを増やす/減らす場合

int a = 5;
a++;        // 後置でも前置でもここだけなら結果は同じ
System.out.println(a); // 出力: 6

int b = 5;
++b;
System.out.println(b); // 出力: 6
Java

どちらも ba 自身の値が 1 増えます(単独で使う場合は違いが出ない)。

「代入」や「他の式で使う」場合の違い(重要)

int x = 5;
int y = x++; // y に代入されるのは「増やす前の値」
System.out.println(x); // 6
System.out.println(y); // 5

int m = 5;
int n = ++m; // m を先に増やしてから、その値を n に代入
System.out.println(m); // 6
System.out.println(n); // 6
Java

流れ(y = x++ の場合) を時間順に書くと:

  1. 右辺 x++ を評価 → 現在の x(=5)を式の値として返す(まだ x は 5)。
  2. その返した値(5)を y に代入 → y = 5
  3. x++ の副作用で x を 1 増やす → x = 6

対して y = ++x の場合

  1. ++x の副作用でまず x = 6
  2. その値(6)を式の値として返し、y = 6

4. よくある落とし穴(要注意)

(A) x = x++ は 値が変わらない(よく間違える)

int x = 5;
x = x++;
System.out.println(x); // 出力: 5
Java

なぜ? 手順で追うと:

  1. 右辺 x++ を評価 → 現在の x(5)を式の値として返す(副作用はあと)。
  2. 代入 x = (右辺値) 実行 → x に 5 が書かれる(まだ右辺の副作用は適用されていない状態で代入される)。
  3. x++ の副作用が起きて x を 1 増やす → しかしこの増加は、たとえば実装上は評価順の違いで見えにくいが、最終的に結果は元の値に上書きされるため増えないことになります(簡単に言うと「増やす」タイミングと「代入」タイミングが競合してしまう)。
    結論:x = x++ のような書き方はバグのもと。やめましょう。

(B) 複雑な式での使い方は混乱しやすい

array[i++] = i;list.set(i++, list.get(i)); のようなコードは可読性が悪く、バグを生みます。読みやすさと意図の明確さを優先してください。

5. よく使う場面:ループ(for)での利用

増分を表すのに最もよく使います。

for (int i = 0; i < 5; i++) {
    System.out.println(i);
}
// 出力: 0 1 2 3 4(それぞれ改行)
Java

ここで i++++i にしても同じ結果(ヘッダ部分では結果が同じ)ですが、ループ本文の式で使う場合は評価タイミングに注意。

6. char に使う例

char c = 'A';
c++;                     // 'A' の次の文字に
System.out.println(c);   // 出力: B
Java

7. 適用できる型

  • 整数型(byte, short, int, long
  • 浮動小数点(float, double)でも動く(1.0増える/減る)
  • char でも動く
  • boolean には使えない

8. 具体的な応用例(実用的)

カウンターとして使う(典型)

int count = 0;
while (count < 3) {
    System.out.println("count = " + count);
    count++;   // 次のループでは 1 増えた値になる
}
Java

配列アクセスでの例(注意が必要)

int[] arr = {10,20,30};
int i = 0;
System.out.println(arr[i++]); // 出力: 10 (i は出力後に 1 になる)
System.out.println(i);       // 出力: 1
Java

9. 練習問題(手を動かして確かめよう)

以下は解答と解説付きです。実際に IDE(Eclipse, IntelliJ, javac)やオンライン実行環境で動かして確認してください。


問題 1

int a = 3;
int b = ++a + 2;
System.out.println(a); // ?
System.out.println(b); // ?
Java

答え & 解説

  • a++a により先に 4 になる → a = 4
  • b = 4 + 2 = 6
    出力:
4
6

問題 2

int x = 4;
int y = x++ + ++x;
System.out.println(x); // ?
System.out.println(y); // ?
Java

答え & 解説(評価順を丁寧に)
Java は左から右に評価します(オペランドの評価順は言語仕様で定められています)。

  1. 左オペランド x++ を評価 → 式値は古い x = 4、そして副作用で x は 5 になる(ただし副作用はそのタイミングで実際に反映)。
  2. 右オペランド ++x を評価 → x は 5 なので先に増えて 6、式値は 6。
  3. 結果 y = 4 + 6 = 10
    最終 x = 6
    出力:
6
10

問題 3

int x = 5;
x = x++;
System.out.println(x); // ?
Java

答え & 解説
出力: 5(先に右辺が 5 と評価され、そのあと代入で 5 がセットされるため。x++ の増分は最終的に上書きされる形になり消える)


問題 4(char)

char c = 'Z';
c++;
System.out.println((int)c); // ?
System.out.println(c);     // ?
Java

答え

  • (int)c'Z' の次の文字 '[' の Unicode 値を表示します。'Z' のコードは 90、'[' は 91。
    出力例:
91
[

問題 5(ループ)
次のコードの出力は?

for (int i = 0; i < 3; ++i) {
    System.out.print(i + " ");
}
Java

答え
0 1 2 (先置・後置どちらでもこの for の場合は同じ)


問題 6(トリッキー)

int i = 1;
int j = (i++ ) + (i++ ) + (i++ );
System.out.println("i = " + i);
System.out.println("j = " + j);
Java

答え & 解説
Java はオペランドを左から右に順に評価するため:

  • 最初の (i++) は式値 1、i → 2
  • 次の (i++) は式値 2、i → 3
  • 最後の (i++) は式値 3、i → 4
    j = 1 + 2 + 3 = 6、最終 i = 4
    出力:
i = 4
j = 6

10. ベストプラクティス(実務で気をつけること)

  • 単純なカウンター用途(forwhile)では積極的に使ってOK。
  • 式の中で複数回同じ変数に ++/-- を混ぜるのは避ける(可読性・バグ防止のため)。
  • x = x + 1; のように明示する方が安全で読みやすい場合もある。
  • x = x++; のような書き方は絶対に避ける。

まとめ

  • ++-- は便利だけど、「いつ増えるか(評価タイミング)」 が理解できていないとバグを生む。
  • まずは 単純な使い方(ループや単独操作)から慣れて、複雑な式では避けるのが安全。
タイトルとURLをコピーしました