インクリメントとデクリメント

生田 陸人
LuaGate エンジニア / 現役エンジニア
編集 LuaGate編集部

インクリメントとデクリメント とは

Java の ++-- 演算子で変数を 1 だけ増減させる方法、そして前置と後置の違いを学びます。

変数を 1 だけ動かしたいときの専用構文

プログラミングを書いていると「変数の値を 1 だけ増やしたい」「1 だけ減らしたい」という操作がとても頻繁に出てきます。たとえば for 文でループカウンタを進めるとき、配列のインデックスを次に進めるとき、ゲームのスコアを 1 点加算するときなど、本当に毎日のように登場します。

そのため Java には専用の演算子が用意されています。それが今回の主役、インクリメント演算子 ++ とデクリメント演算子 -- です。普段は i = i + 1; と書くところを、i++; のたった 3 文字で済ませられる、というショートカットです。

i = i + 1;i++; と書けると、ループや配列操作のコードがぐっと短く読みやすくなります。C C++ Java JavaScript Go など、多くの言語で同じ記法が共通しているのは、それだけ使う頻度が高い操作だからです。

ただし、この演算子には初心者を必ず一度はハマらせる罠があります。それが「前置」と「後置」の違いです。このレッスンでは、まず基本の使い方を押さえてから、前置と後置の違いをコードと図でじっくり見ていきます。

基本の使い方

++-- の基本形は次のとおりです。

  • x++;x の値を 1 増やす (x = x + 1; と同じ)
  • x--;x の値を 1 減らす (x = x - 1; と同じ)
  • ++x;x の値を 1 増やす (x = x + 1; と同じ)
  • --x;x の値を 1 減らす (x = x - 1; と同じ)

単独の文として書くだけなら、x++;++x;まったく同じ動き です。どちらも x を 1 増やすだけ。差は出ません。

Java

public class Demo { public static int basic() { int x = 10; x++; // x は 11 ++x; // x は 12 x--; // x は 11 --x; // x は 10 return x; } }

このコードは何度実行しても 10 を返します。x++++x も、単独の文として書く限りは「x を 1 動かす」という同じ仕事をするだけです。

注意してほしいのは、++-- が使えるのは 変数だけ だということです。5++ のように数字リテラルに直接書くことはできません。int x = 5; x++; のように、必ず変数を用意してからその変数を増減させます。

前置と後置の違い

さて、ここからが本題です。x++++x は、式の中で他の演算と組み合わせたとき に違いが出ます。具体的には次のとおりです。

  • 前置 (++x --x) — まず x を 1 増減させて、その後の新しい値 を式の中で使う
  • 後置 (x++ x--) — まず 今の値 を式の中で使って、その後で x を 1 増減させる

言葉だけだと混乱するので、コードで見てみましょう。

Java

public class PrefixPostfix { public static void compare() { int a = 5; int b = ++a; // 先に a を 6 にしてから b に代入 → a=6, b=6 int c = 5; int d = c++; // 先に c の値 5 を d に代入してから c を 6 に → c=6, d=5 } }

同じく ac をどちらも 5 から始めても、前置で代入した b6、後置で代入した d5 と、結果が違います。

後置 c++ は「先に値を取り出して、それから変数を増やす」という二段階の動きをしています。順序を図にすると次のようになります。

diagram (will load when visible)

前置は「増やしてから使う」、後置は「使ってから増やす」。この順序の違いが、式の中で他の演算とつながったときに結果の違いになって現れます。

初心者のうちは、迷ったら「単独の文で書く」のが安全です。b = ++a; のように代入と組み合わせるのではなく、a++;b = a; のように 2 行に分けて書けば、読む人も自分も誤読しません。慣れてきてから式の中で使うようにしましょう。

このレッスンの課題のヒント

今回の課題では、引数 n から「1 つ前の値」と「1 つ後の値」を取り出して文字列にする nextAndPrev メソッドを作ります。条件として、n - 1n + 1 を使わず、--++ 演算子を使うこと という縛りがあります。

つまり、n をそのまま増減させずに、いったん別の変数にコピーしてから ++ -- で動かすのがコツです。

Java

public class Solution { public static String nextAndPrev(int n) { int copy1 = n; int copy2 = n; --copy1; // copy1 は n - 1 と同じ値 ++copy2; // copy2 は n + 1 と同じ値 return "prev = " + copy1 + ", next = " + copy2; } }

copy1copy2 という別の変数を 2 つ用意して、片方を -- で 1 減らし、もう片方を ++ で 1 増やす。これで prevnext の値が手に入ります。最後に文字列連結 + でつないで返せば完成です。

文字列連結の + と数値の + は記号は同じですが、Java は左右の型を見て自動で判断します。"prev = " + copy1 のように、片方が String だともう一方も文字列に変換してつなげてくれます。

よくある間違い

++-- は便利ですが、初心者が必ず一度はハマるポイントがあります。代表的な落とし穴を 3 つ紹介します。

  • 前置と後置の混同b = a++;b = ++a; を「同じだろう」と思って書くと、b に入る値が違ってバグになります。代入や式の中で使うときは、必ずどちらか意識すること
  • 同じ式の中で同じ変数を何度も増減させるint y = x++ + x++; のように 1 行で x を 2 回動かすコードは、読みづらいうえに動作の理解も難しくなります。Java では仕様上動作は決まっていますが、避けるべきコード の代表例です
  • n をそのまま n++ してしまう — 今回の課題のように引数の値を保ったまま +1 -1 した値が欲しい場合、n++ をすると n の値そのものが変わってしまいます。必ず別の変数にコピーしてから動かすこと

もうひとつ、ループの中で i++ と書くのは定番ですが、for (int i = 0; i < 10; i++)i++++i に書き換えても 挙動は同じ です。for 文の更新式は単独の文なので、前置でも後置でも結果は変わりません。「++i のほうが速い」という話はかつてありましたが、現代の JVM ではほぼ差はありません。読みやすいほうを選びましょう。

プロのコードレビューでは「同じ行で同じ変数を 2 回動かす式」は赤信号扱いされることが多いです。「動くから OK」ではなく「読んでわかるか」を基準にコードを書く癖をつけましょう。

やってみよう

それでは課題に挑戦してみましょう。手順は次のとおりです。

  1. 引数 n をコピーする変数を 2 つ用意する (int copy1 = n;int copy2 = n;)
  2. 片方に --、もう片方に ++ を使って、それぞれ 1 減らした値と 1 増やした値を作る
  3. 文字列連結で "prev = " + (1 減らした値) + ", next = " + (1 増やした値) の形を組み立てて return する

注意点としては、出力フォーマットの空白とカンマを正確に揃えることです。prev = 4, next = 6 のように、= の前後、, の後ろにはそれぞれ半角スペースが 1 つずつ入ります。スペースの有無で test は fail するので、慎重に書きましょう。

慣れてきたら、++-- を前置と後置に書き換えて、テストが pass するかどうかを試してみてください。今回の課題のように単独の文で使う限り、前置でも後置でも結果は同じになります。動かしながら覚えるのが、++-- を体得するいちばんの近道です。

よくある質問

Q. Java と他言語の文法はどう違いますか?

A. Java は静的型付けで、変数宣言時に型を明示します(int x = 0;)。中括弧でブロックを表し、文末にセミコロンが必要です。Python の動的型付けや JavaScript の柔軟さに慣れていると最初は窮屈ですが、コンパイル時にバグが発見できる安全性がメリットです。

Q. コードが動かないときに最初に見るべき場所は?

A. コンパイルエラーは行番号とエラー種別(cannot find symbol、incompatible types など)が表示されます。実行時例外はスタックトレースの最初の at ... が原因行です。IDE(IntelliJ / VS Code)の警告も丁寧に潰すと、半分のバグは未然に防げます。

Q. Java の習得後に学ぶべき技術は何ですか?

A. 基本構文を抑えたら java-intermediate(コレクション / ジェネリクス / Stream / 例外)に進み、Spring Boot や Web 開発に展開するのが王道です。クラウド時代は Kotlin / Scala への展開も視野に入りますが、まずは Java 標準を固めるのが効率的です。

次のレッスン

次は 比較演算子 で、Java の ++-- 演算子で変数を 1 だけ増減させる方法、そして前置と後置の違いを学びます を学びます。

事前確認 — 進む前に次の 3 つができることを確認しましょう。

  1. ++ と -- の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. ++ と -- とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

要件

  1. クラス名は Solution、メソッド名は nextAndPrev、引数は int n 1 つ、戻り値の型は String
  2. メソッドの中で ++-- 演算子を必ず使うこと (n - 1n + 1 のような算術演算で代用しない)
  3. 戻り値は "prev = X, next = Y" の形式 (= の前後と , の後ろに半角スペース 1 つずつ)

入出力例

test-cases.txt

nextAndPrev(5)"prev = 4, next = 6" nextAndPrev(0)"prev = -1, next = 1" nextAndPrev(-3)"prev = -4, next = -2"

ヒント

main.java
main.java
学習モード

メモ

インクリメントとデクリメント

⌘S で保存