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

1だけ増やす、1だけ減らす――その小さな操作をスマートに書けるのが、インクリメント・デクリメント演算子です。

Javaでプログラムを書いていると、変数の値を1だけ増やしたい、あるいは1だけ減らしたい、という場面がとてもよく出てきます。たとえば、回数を数える、ページ番号を進める、残り個数を減らす、繰り返しの回数を管理する、といった処理です。こうしたときに便利なのが、インクリメント演算子デクリメント演算子です。

これらの演算子は、見た目はとても短くシンプルですが、Javaではとてもよく使われる大切な記法です。特に、for 文や while 文のような繰り返し処理では、ほとんど必ずといってよいほど登場します。そのため、早い段階でしっかり意味を理解しておくことが大切です。

また、インクリメントとデクリメントには、単に値を増減させるだけでなく、前置後置という書き方の違いがあります。この違いは、単独で使うときにはそれほど大きく感じられないかもしれませんが、代入や他の式と組み合わせると結果が変わることがあります。ここは初心者がつまずきやすいところでもあるので、丁寧に確認していきましょう。

ここでは、まずインクリメント演算子とデクリメント演算子の基本をおさえたうえで、前置と後置の違いまで、サンプルプログラムや図を使いながらわかりやすく解説していきます。

インクリメント演算子とは

まず見ておきたいのが、++ という演算子です。これは インクリメント演算子 と呼ばれます。インクリメントとは、変数の値を 1増やす ことです。

たとえば、

a++;

と書くと、変数 a の値を 1 増やすことができます。

これは、これまで見てきた次の書き方と同じ意味です。

a = a + 1;

つまり、インクリメント演算子は、変数の値に1を足す処理を短く書ける記法だと考えるとわかりやすいです。

表にすると、次のようになります。

書き方意味
a++a の値を 1 増やす
a = a + 1a の値を 1 増やす

どちらも結果は同じですが、++ を使ったほうが簡潔で、Javaらしい書き方になります。

デクリメント演算子とは

反対に、-- という演算子は デクリメント演算子 と呼ばれます。デクリメントとは、変数の値を 1減らす ことです。

たとえば、

b--;

と書くと、変数 b の値を 1 減らすことができます。

これは、次の書き方と同じ意味です。

b = b - 1;

こちらも表で整理してみましょう。

書き方意味
b--b の値を 1 減らす
b = b - 1b の値を 1 減らす

このように、++ と -- は、1だけ増やす、1だけ減らす、という場面でとても便利です。

なぜ専用の演算子があるのか

ここで、「a = a + 1 でも書けるのに、なぜわざわざ ++ を使うのだろう」と感じるかもしれません。

その理由は、1だけ増やす、1だけ減らす処理はプログラムの中で非常によく使うからです。頻繁に使う処理なので、Javaでは専用の短い書き方が用意されています。

たとえば、次のような場面です。

場面
回数を数えるボタンを押した回数を1増やす
ページを進める現在のページ番号を1増やす
残りを減らす残り個数を1減らす
繰り返し処理ループ変数を1ずつ増やす

このように、1ずつ増減させる処理はとてもよく出てきます。そのため、++ や -- を自然に使えるようになると、コードが読みやすくなり、書くのも楽になります。

まずは単純な増減を見てみよう

最初に、単純に値を増やしたり減らしたりする例を見てみましょう。

ファイル名:Sample5.java

class Sample5
{
    public static void main(String[] args)
    {
        int point = 3;
        int ticket = 5;

        // pointの値を1増やす
        point++;

        // ticketの値を1減らす
        ticket--;

        System.out.println("ポイントは " + point + " になりました。");
        System.out.println("チケットは " + ticket + " 枚になりました。");
    }
}

このプログラムでは、point を 1 増やし、ticket を 1 減らしています。

実行結果はこうなります。

ポイントは 4 になりました。
チケットは 4 枚になりました。

ここでは、++ と -- を単独で使っているので、それほど難しくありません。変数の値が1だけ増える、または減る、と素直に読めば大丈夫です。

この図では、左側で 3 が ++ によって 4 になることを示しています。これは、変数の値に 1 を加える処理です。右側では 5 が -- によって 4 になることを示していて、こちらは変数の値から 1 を引く処理です。

こうして見ると、++ と -- はとてもシンプルですね。まずは、++ は 1増やす、-- は 1減らすという基本をしっかり押さえておきましょう。

前置と後置がある

ここからが大切なポイントです。インクリメント演算子とデクリメント演算子は、変数の前にも後ろにも書くことができます。

たとえば、変数 a をインクリメントするときには、次の2つの書き方があります。

a++;
++a;
  • 変数の後ろに置く書き方を 後置
  • 変数の前に置く書き方を 前置

といいます。

名前を整理すると、次のようになります。

書き方名前
a++後置インクリメント演算子
++a前置インクリメント演算子
b--後置デクリメント演算子
--b前置デクリメント演算子

単独で使う場合は、前置でも後置でも、最終的に変数の値が1増えることには変わりありません。たとえば、

a++;

++a;

も、どちらも a の値を 1 増やします。

ただし、代入や他の式と組み合わせたときには、この違いが結果に表れます。

後置インクリメントの動き

まずは、後置インクリメントを使った例を見てみましょう。

ファイル名:Sample5.java
Sample5.java を以下のように修正します。

class Sample5
{
    public static void main(String[] args)
    {
        int count = 0;
        int result = 0;

        // 代入したあとでcountを1増やす
        result = count++;

        System.out.println("後置インクリメントを使ったのでresultの値は "
                            + result + " です。");
        System.out.println("処理後のcountの値は " + count + " です。");
    }
}

このプログラムを実行すると、次のようになります。

後置インクリメントを使ったのでresultの値は 0 です。
処理後のcountの値は 1 です。

ここが少し大事です。後置インクリメントでは、

  1. まず現在の count の値を使う
  2. そのあとで count を 1 増やす

という順番で処理されます。

今回、count は最初 0 でした。ですから、まず 0 が result に代入されます。そのあとで count が 1 に増えます。

つまり、

result = count++;

は、感覚としては次のように理解できます。

  • 先に result = count を行う
  • そのあとで count を 1 増やす

前置インクリメントの動き

次に、前置インクリメントを使った場合を見てみましょう。

ファイル名:Sample5.java
Sample5.java を以下のように修正します。

class Sample5
{
    public static void main(String[] args)
    {
        int count = 0;
        int result = 0;

        // 先にcountを1増やしてから代入する
        result = ++count;

        System.out.println("前置インクリメントを使ったのでresultの値は "
                            + result + " です。");
        System.out.println("処理後のcountの値は " + count + " です。");
    }
}

この場合の実行結果はこうなります。

前置インクリメントを使ったのでresultの値は 1 です。
処理後のcountの値は 1 です。

前置インクリメントでは、

  1. まず count を 1 増やす
  2. そのあとで、その新しい値を使う

という順番になります。

最初 count は 0 なので、まず 1 に増えます。そのあと、その 1 が result に代入されます。

つまり、

result = ++count;

は、感覚としては次のように理解できます。

  • 先に count を 1 増やす
  • そのあとで result = count を行う

前置と後置の違いを表で整理しよう

この違いは、表にするとかなりわかりやすくなります。

初期値が count = 0 のときを考えてみます。

書き方処理の順番result の値count の最終値
result = count++;代入してから増やす01
result = ++count;増やしてから代入する11

最終的な count の値はどちらも 1 になりますが、result に入る値が異なることがポイントです。

この違いを知らないまま使うと、「思った結果と違う」と感じる原因になります。

この図の左側では、後置インクリメントの流れを示しています。まず count の今の値が result に代入され、そのあとで count が増えます。だから result には増える前の値が入ります。

右側では、前置インクリメントの流れを示しています。こちらは先に count を増やし、そのあとで result に代入します。だから result には増えたあとの値が入ります。

この違いは小さく見えますが、実際のプログラムではとても重要です。

デクリメント演算子でも同じ考え方になる

ここまではインクリメントを中心に見てきましたが、デクリメント演算子でも考え方は同じです。

たとえば、

value--;

は後置デクリメントなので、

  • まず今の value を使う
  • そのあとで 1 減らす

という流れになります。

一方で、

--value;

は前置デクリメントなので、

  • まず 1 減らす
  • そのあとで減った値を使う

という流れになります。

表で整理するとこうなります。

初期値が value = 3 の場合です。

書き方処理の順番result の値value の最終値
result = value--;代入してから減らす32
result = --value;減らしてから代入する22

インクリメントとデクリメントは、増やすか減らすかの違いだけで、前置と後置の考え方は同じです。

単独で使うなら違いをあまり意識しなくてもよい

ここまで読むと、前置と後置はとてもややこしく感じるかもしれません。でも、まず安心してよいのは、単独の文として使う場合は、そこまで神経質にならなくてよいということです。

たとえば、

count++;

++count;

のように、代入や他の演算と組み合わせずに1行だけで使うなら、どちらも count を 1 増やす、という意味になります。

同じように、

value--;

--value;

も、単独で使うだけなら value を 1 減らすという意味です。

本当に注意が必要なのは、次のように 式の中で使うとき です。

result = count++;
result = ++count;

このような場面では、前置か後置かによって結果が変わります。

よくある理解のポイント

インクリメント・デクリメント演算子を学ぶときは、次のポイントをしっかり押さえておくと安心です。

ポイント内容
++ はインクリメント変数の値を1増やす
-- はデクリメント変数の値を1減らす
単独なら基本はシンプル前置でも後置でも増減の結果は同じ
式の中では違いが出る前置は先に増減、後置はあとで増減
代入と組み合わせると要注意result に入る値が変わることがある

実際のプログラムでよく使う場面

インクリメントとデクリメントは、Javaの実用的なコードでもよく出てきます。

たとえば、

  • 繰り返し回数を 1 ずつ増やす
  • 配列の位置を 1 ずつ進める
  • 残り回数を 1 ずつ減らす
  • ページ番号を増減させる

といった処理です。

たとえば for 文では、こんな形がよく使われます。

for (int i = 0; i < 5; i++)

この i++ は、繰り返しが1回終わるごとに i を 1 増やす、という意味です。ここでもインクリメント演算子が自然に使われています。

このように、++ や -- は一見小さな記号ですが、Javaのコードではとても大切な役割を持っています。意味をしっかり理解して使えるようになると、今後の学習でもぐっと読みやすく、書きやすくなっていきます。