Java超|インクリメント・デクリメント

インクリメントは戦闘力を1段階上げる技、デクリメントは残りエネルギーを1段階下げる技。前に置くか後ろに置くかで、値を使うタイミングが変わる。

Javaでは、変数の値を 1だけ増やしたい、または 1だけ減らしたい 場面がよくあります。

たとえば、次のような処理です。

場面変数の動き
修行回数を数える1回終わるたびに回数を1増やす
残り体力を管理するダメージを受けるたびに体力を減らす
ページ番号を進める次のページへ移動するたびに番号を1増やす
残りチケットを減らす使うたびに1枚減らす
繰り返し処理の回数を管理する1回ごとにカウンタを1増やす

このようなときに使える便利な演算子が、インクリメント演算子デクリメント演算子 です。

インクリメントは、変数の値を1増やすことです。

デクリメントは、変数の値を1減らすことです。

演算子名前意味
++インクリメント演算子値を1増やす
--デクリメント演算子値を1減らす

ドラゴンボール風にたとえるなら、インクリメントは、修行によって戦闘力を 1段階高める技 です。

デクリメントは、戦闘や消費によって体力や残り札を 1段階減らす技 です。

たとえば、focus という変数に集中力が入っているとします。

focus++;

これは、focus の値を1増やすという意味です。

また、charm という変数に護符の枚数が入っているとします。

charm--;

これは、charm の値を1減らすという意味です。

ただし、インクリメントとデクリメントには少し注意が必要です。

++ や -- は、変数の に置くことも、後ろ に置くこともできます。

focus++;
++focus;

charm--;
--charm;

単独で使う場合は、最終的な変数の値は同じです。

しかし、代入や計算式の中で使うと、値を使うタイミング が変わります。

ここが、インクリメント・デクリメントでとても大切なポイントです。

ドラゴンボール風に言えば、先に気を高めてから技を出すのか、今の気で技を出してから気が高まるのか、という違いです。

この順番の違いが、前置と後置の違いにつながります。

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

インクリメント演算子は、変数の値を1増やすための演算子です。

Javaでは、次のように書きます。

point++;

これは、次の処理と同じ意味です。

point = point + 1;

つまり、point++ は、point の現在の値に1を足して、その結果をもう一度 point に入れる短い書き方です。

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

たとえば、point に 3 が入っているとします。

int point = 3;
point++;

point++ が実行されると、point の値は 4 になります。

処理前処理処理後
3point++4

ドラゴンボール風にたとえるなら、point++ は、戦士が修行を1回こなして、集中力や戦闘力を1段階上げる動きです。

現在の集中力が3なら、修行後に4になります。

デクリメント演算子とは

デクリメント演算子は、変数の値を1減らすための演算子です。

Javaでは、次のように書きます。

ticket--;

これは、次の処理と同じ意味です。

ticket = ticket - 1;

つまり、ticket-- は、ticket の現在の値から1を引いて、その結果をもう一度 ticket に入れる短い書き方です。

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

たとえば、ticket に 5 が入っているとします。

int ticket = 5;
ticket--;

ticket-- が実行されると、ticket の値は 4 になります。

処理前処理処理後
5ticket--4

ドラゴンボール風にたとえるなら、ticket-- は、戦闘で護符やエネルギー札を1つ使うようなイメージです。

残りの護符が5枚なら、1枚使って4枚になります。

まずは単純な増減を確認する

インクリメントとデクリメントを単独で使う場合は、とてもシンプルです。

++ は1増やす。
-- は1減らす。

まずはこの基本をしっかり押さえましょう。

ファイル名:Sample5.java

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

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

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

        System.out.println("集中力は " + focus + " になりました。");
        System.out.println("護符は " + charm + " 枚になりました。");
    }
}

実行結果

集中力は 4 になりました。
護符は 4 枚になりました。

このプログラムでは、focus に 3 が入っています。

そのあとで、focus++ を実行しています。

focus++;

これにより、focus の値は 3 から 4 に増えます。

また、charm には 5 が入っています。

そのあとで、charm-- を実行しています。

charm--;

これにより、charm の値は 5 から 4 に減ります。

変数最初の値処理処理後の値
focus3focus++4
charm5charm--4

ここでは、++ と -- を単独の文として使っています。

そのため、難しく考えすぎる必要はありません。

focus++ は、focus を1増やす。
charm-- は、charm を1減らす。

このように読めば大丈夫です。

ドラゴンボール風に言えば、focus++ は修行で集中力を1段階高める動きです。

charm-- は護符を1枚使って残り枚数が減る動きです。

図:インクリメントとデクリメントの基本

この図が示していること

この図は、++ が変数の値を1増やし、-- が変数の値を1減らすことを示しています。

左側では、focus の値が 3 から 4 に変わっています。

これは focus++ によって、focus の値が1増えたことを表しています。

右側では、charm の値が 5 から 4 に変わっています。

これは charm-- によって、charm の値が1減ったことを表しています。

インクリメントとデクリメントは、変数の値を直接変化させる演算子です。

単独で使う場合は、++ は1増やす、-- は1減らすと読めば理解しやすくなります。

前置と後置がある

インクリメント演算子とデクリメント演算子は、変数の後ろにも前にも置けます。

focus++;
++focus;

charm--;
--charm;

変数の後ろに置く書き方を 後置 といいます。

変数の前に置く書き方を 前置 といいます。

書き方名前基本の意味
focus++後置インクリメントfocus を1増やす
++focus前置インクリメントfocus を1増やす
charm--後置デクリメントcharm を1減らす
--charm前置デクリメントcharm を1減らす

単独で使う場合、前置でも後置でも、最終的な変数の値は同じです。

focus++;

も、

++focus;

も、どちらも focus を1増やします。

同じように、

charm--;

も、

--charm;

も、どちらも charm を1減らします。

ただし、代入や他の式と組み合わせると、結果が変わることがあります。

ここが、前置と後置で一番大切なポイントです。

使い方前置と後置の違い
単独で使う最終的な変数の値は同じ
式の中で使う値を使うタイミングが変わる
代入と組み合わせる左辺に入る値が変わることがある

ドラゴンボール風に考えると、後置は 今の状態で技を出してから、戦闘力が1上がる 流れです。

前置は 先に戦闘力を1上げてから、その状態で技を出す 流れです。

この違いを、次の Sample5.java(修正1)と Sample5.java(修正2)で確認していきましょう。

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

後置インクリメントは、現在の値を先に使い、そのあとで1増やします。

次のコードでは、focus++ を代入式の中で使っています。

ファイル名:Sample5.java(修正1)

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

        // 先にfocusの現在の値をresultに入れ、そのあとfocusを1増やす
        result = focus++;

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

実行結果

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

このプログラムでは、focus の最初の値は 0 です。

int focus = 0;
int result = 0;

そして、次の文を実行しています。

result = focus++;

後置インクリメントでは、次の順番で処理されます。

順番処理値の変化
1focus の現在の値を result に入れるresult は 0
2focus を1増やすfocus は 1

つまり、result には増える前の値 0 が入ります。

そのあとで、focus が 1 に増えます。

変数最終的な値
result0
focus1

ドラゴンボール風にたとえるなら、後置インクリメントは、今の集中力で技を出してから、修行効果で集中力が1段階上がる ような流れです。

技に使われるのは、まだ高まる前の値です。

この例では、result に入るのは focus が増える前の 0 です。

そのあとで、focus が 1 になります。

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

前置インクリメントは、先に1増やし、その増えた後の値を使います。

次のコードでは、++focus を代入式の中で使っています。

ファイル名:Sample5.java(修正2)

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

        // 先にfocusを1増やし、その新しい値をresultに入れる
        result = ++focus;

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

実行結果

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

このプログラムでも、focus の最初の値は 0 です。

int focus = 0;
int result = 0;

そして、次の文を実行しています。

result = ++focus;

前置インクリメントでは、次の順番で処理されます。

順番処理値の変化
1focus を1増やすfocus は 1
2増えた後の focus を result に入れるresult は 1

つまり、result には増えた後の値 1 が入ります。

focus の最終的な値も 1 です。

変数最終的な値
result1
focus1

ドラゴンボール風にたとえるなら、前置インクリメントは、先に集中力を1段階高めてから、その状態で技を出す ような流れです。

技に使われるのは、高まった後の値です。

この例では、result に入るのは focus が増えた後の 1 です。

focus も 1 になります。

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

focus の初期値が 0 の場合で比べると、違いがはっきりします。

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

注目したいのは、focus の最終値はどちらも 1 になることです。

しかし、result に入る値が違います。

後置の場合は、増える前の値が result に入ります。

前置の場合は、増えた後の値が result に入ります。

種類値を使うタイミング
後置インクリメント今の値を使ってから1増やす
前置インクリメント1増やしてから新しい値を使う

この違いは小さく見えます。

しかし、プログラムの結果には大きく関わることがあります。

特に、代入式や計算式の中で ++ を使うときは、前置なのか後置なのかを必ず確認しましょう。

図:後置と前置の処理順序

この図が示していること

この図は、後置インクリメントと前置インクリメントの処理順序の違いを示しています。

左側の result = focus++ では、先に focus の現在値 0 を result に入れます。

そのあとで focus を1増やします。

そのため、result は 0、focus は 1 になります。

右側の result = ++focus では、先に focus を1増やします。

そのあとで、増えた後の値を result に入れます。

そのため、result は 1、focus は 1 になります。

前置と後置の違いは、増やす処理そのものではありません。

どちらも focus を1増やします。

違うのは、値を使うタイミング です。

後置は、今の値を使ってから増やします。

前置は、先に増やしてから新しい値を使います。

この違いを押さえると、result に入る値がなぜ変わるのかを理解しやすくなります。

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

デクリメント演算子でも、前置と後置の考え方は同じです。

インクリメントは1増やす処理でした。

デクリメントは1減らす処理です。

ただし、前置と後置の考え方は共通しています。

後置デクリメントは、現在の値を先に使い、そのあとで1減らします。

result = charm--;

前置デクリメントは、先に1減らし、その減った後の値を使います。

result = --charm;

charm の初期値が 3 の場合で整理すると、次のようになります。

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

後置デクリメントでは、charm の現在値 3 が先に result に入ります。

そのあとで、charm が 2 に減ります。

前置デクリメントでは、先に charm が 2 に減ります。

そのあとで、減った後の 2 が result に入ります。

種類後置前置
インクリメント使ってから1増やす1増やしてから使う
デクリメント使ってから1減らす1減らしてから使う

ドラゴンボール風にたとえるなら、後置は 今の状態で行動してから変化する 流れです。

前置は 先に状態を変えてから行動する 流れです。

これは、++ でも -- でも同じです。

単独で使う場合は結果が同じになる

前置と後置の違いは大切です。

ただし、いつでも結果が変わるわけではありません。

たとえば、次のように単独で使う場合です。

focus++;

++focus;

この2つは、どちらも focus を1増やします。

代入や計算式の中で使っていないので、最終的な focus の値だけを見れば同じです。

デクリメントも同じです。

charm--;

--charm;

この2つは、どちらも charm を1減らします。

つまり、前置と後置の違いを強く意識する必要があるのは、次のような式の中で使う場合です。

result = focus++;
result = ++focus;
result = charm--;
result = --charm;

このように、代入と組み合わせると、result に入る値が変わります。

使い方前置と後置の違い
focus++;focus の最終値だけを見れば ++focus と同じ
++focus;focus の最終値だけを見れば focus++ と同じ
result = focus++;result に増える前の値が入る
result = ++focus;result に増えた後の値が入る

初心者のうちは、単独で使う場合は 1増やす、1減らす と考えれば十分です。

式の中で使う場合は、前置か後置かを確認しましょう。

よくある理解のポイント

インクリメントとデクリメントで特に大切な点を整理します。

ポイント内容
++変数の値を1増やす
--変数の値を1減らす
後置今の値を使ってから、増減する
前置先に増減してから、その値を使う
単独の文前置でも後置でも、最終的な変数の値は同じ
式の中result に入る値が変わることがある

特に大切なのは、次の感覚です。

後置は、あとで変わる。
前置は、先に変わる。

result = focus++;

これは、focus の今の値を result に渡してから、focus を1増やします。

result = ++focus;

これは、focus を1増やしてから、その値を result に渡します。

この違いを押さえておくと、コードを読んだときに「なぜこの値になるのか」が見えやすくなります。

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

インクリメントとデクリメントは、Javaのさまざまな場面で登場します。

場面使い方のイメージ
回数を数える処理が1回終わるたびに count++
配列の位置を進める次の要素を見るために index++
残り回数を減らす残り回数を remain--
ページ番号を進める次のページへ進むために page++
繰り返し処理for 文で i++
ゲームのターン管理ターンが進むたびに turn++
残り体力の段階管理状況に応じて hp--

たとえば、for 文では次のような形がよく出てきます。

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

この i++ は、繰り返しが1回終わるたびに i を1増やすという意味です。

ここでは i++ が更新処理として使われています。

そのため、前置と後置の違いを深く意識しなくても問題になりにくい場面です。

ただし、代入式や計算式の中で使う場合は、前置と後置の違いを確認する必要があります。

result = i++;

result = ++i;

この2つでは、result に入る値が変わる可能性があります。

ドラゴンボール風にたとえるなら、for 文の i++ は、修行メニューが1回終わるたびに修行回数を1増やす記録係のようなものです。

一方、result = i++ のような式では、今の修行回数を先に使うのか、増やしてから使うのかが結果に関わります。

前置と後置を安全に使う考え方

初心者のうちは、インクリメント・デクリメントを安全に読むために、次のように考えると分かりやすいです。

状況考え方
ただ1増やしたいcount++ のように単独で使う
ただ1減らしたいcount-- のように単独で使う
式の中で使う前置か後置かを必ず確認する
result に入る値が重要処理順序を表で考える
迷った場合増減処理と代入処理を分けて書く

たとえば、次のように書くと、前置と後置の違いで迷いやすくなります。

result = focus++;

慣れるまでは、次のように分けて考えると分かりやすいです。

result = focus;
focus++;

この2行は、後置インクリメントの流れを分解した形です。

先に focus の値を result に入れます。

そのあとで focus を1増やします。

前置の場合も、次のように分けると理解しやすくなります。

focus++;
result = focus;

この2行は、前置インクリメントの流れを分解した形です。

先に focus を1増やします。

そのあとで、増えた後の focus を result に入れます。

書き方分けて考えると
result = focus++;result = focus; のあとに focus++;
result = ++focus;focus++; のあとに result = focus;
result = charm--;result = charm; のあとに charm--;
result = --charm;charm--; のあとに result = charm;

このように分けて考えると、値がどのタイミングで変わるのかがはっきりします。

特に学習初期では、短い書き方をそのまま暗記するより、処理の順番を分解して理解することが大切です。

図:前置と後置を安全に読む考え方

この図が示していること

この図は、前置と後置の処理を安全に読むために、複雑に見える式を2つの処理に分けて考える方法を示しています。

後置の result = focus++ は、次のように考えられます。

result = focus;
focus++;

つまり、先に focus の現在値を result に渡し、そのあとで focus を1増やします。

前置の result = ++focus は、次のように考えられます。

focus++;
result = focus;

つまり、先に focus を1増やし、そのあとで増えた後の focus を result に渡します。

前置と後置の違いは、++ や -- によって値が変わること自体ではありません。

違いは、値を使う順番 です。

後置は、今の値を使ってから変化します。

前置は、先に変化してから値を使います。

迷ったときは、1行の式を2行に分けて考えると、result に入る値や変数の最終値を追いやすくなります。

学習で特に意識したいこと

インクリメントとデクリメントは、記号としてはとても短いです。

しかし、前置と後置の違いまで含めると、意外と奥が深い演算子です。

特に意識したいのは、次の3つです。

意識すること理由
++ は1増やす基本の意味を押さえるため
-- は1減らす基本の意味を押さえるため
式の中では順番を見るresult に入る値が変わるため

ドラゴンボール風にたとえるなら、同じ戦闘力アップの技でも、技を出す前に気を高めるのか、技を出したあとに気が高まるのかで、技に乗る力が変わります。

Javaでも同じです。

result = focus++;

は、今の focus を使ってから増やします。

result = ++focus;

は、focus を増やしてから使います。

この いつ値が変わるのか を意識できるようになると、インクリメント・デクリメント演算子はかなり読みやすくなります。

書き方読み方
focus++focus を使ったあとで1増やす
++focusfocus を1増やしてから使う
charm--charm を使ったあとで1減らす
--charmcharm を1減らしてから使う

単独で使うときは、++ は1増やす、-- は1減らすで十分です。

式の中で使うときは、前置か後置かを見て、値を使うタイミングを確認しましょう。