💡

i++と++i、実行順序で迷う方へ 〜自戒を込めて〜

2024/11/23に公開

はじめに

早速ですが、抜き打ちテストです。

Q.次のプログラムの実行結果は?

public class Test {
    public static void main(String[] args) {
        int i = 0;
        System.out.println(i++ + ++i);
    }
}
答え

20 + 2 = 2

抜き打ちテストはこれで終了です。いかがだったでしょうか?

即答できたあなたへ

おめでとうございます!この記事の内容はすでにマスター済みですね。どうぞそっと記事を閉じていただいて構いません。

即答できなかったあなたへ
仲間です!
あなたは過去の私と同じく、前置・後置インクリメントをわかったつもり状態である可能性大です。本記事を通してしっかり理解し、次のステージへ進みましょう。(勉強との終わりなき闘い・・・)

i++, ++i の挙動について

Javaにおけるインクリメント演算子は、前置インクリメント (++i)後置インクリメント (i++) の2種類あります。

基本ルール

種類 使用例 説明
前置インクリメント ++i 値を1増加させた後に変数を評価
後置インクリメント i++ 変数を評価した後で値を1増加

デクリメント(--ii--)についても同様の動作をします。

詳細な挙動の例

具体的なプログラム例を用いて、それぞれの動きを確認してみましょう。

例1: 前置と後置の違い

public class Test {
    public static void main(String[] args) {
        int i = 1;
        System.out.println(++i); // 出力: 2
        System.out.println(i++); // 出力: 2
        System.out.println(i);   // 出力: 3
    }
}
  • ++i は、i1増やしてから その値を返す。
  • i++ は、iそのまま返した後で 値を1増やす。

抜き打ちテスト問題の解説

public class Test {
    public static void main(String[] args) {
        int i = 0;
        System.out.println(i++ + ++i);
    }
}
  1. i++ の部分で、現在の i の値(0)が評価されます。この時点で、i は1増えます。
    評価: 0, iの値: 1
  2. 続いて、++i の部分で i が1増加して 2 になり、その値が評価されます。
    評価: 2, iの値: 2
  3. 足し算が行われて 0 + 2 = 2 となります。
コラム

1つの疑問

よく言われる「単体でのインクリメントであれば、前置・後置どちらでもよい」という意見。
しかし、これは初学者にとって混乱を招きやすいと感じています。特に、for文の第3引数での使用方法について、選び方・違いが分からず悩むことがあるのではないでしょうか。

for文における増加式の特性

for文の増加式は、前置でも後置でも結果に違いが出ないように見えます。
いったいなぜなのか、その正体を探ってみましょう!

1. 増加式の戻り値は使用されない

for文の増加式 (i++++i) の評価結果(戻り値)は無視されます。
増加式の主な目的は カウント変数を変更する ことなので、式の評価値が次の処理に伝播することはありません。

例えば、以下のコードを見てください:

for (int i = 0; i < 5; i++) {  // i++ (後置)
    System.out.println(i);
}

for (int i = 0; i < 5; ++i) {  // ++i (前置)
    System.out.println(i);
}

この場合、i++++i の評価結果(戻り値)が使われないため、どちらでもループの動作は同じです。

2. インクリメントがループの最後で実行される

for文では、増加式はループの 最後 に実行されます。

  • 増加式はループの中の処理(System.out.println(i); など)に影響を与えません。
  • そのため、前置でも後置でも、単に「ループの最後にカウント変数を増やす」という役割を果たすだけになります。

分解して考える

for文を次のように分解すると、挙動が明確になります。

for (int i = 0; i < 5; i++) {
    System.out.println(i);
}

これを擬似的に分解すると、

int i = 0;            // 初期化式
while (i < 5) {       // 条件式
    System.out.println(i); // 処理内容
    i++;              // 増加式 (前置でも後置でも同じ役割)
}

この分解を見ると、増加式の評価値はどこにも使われていないことが分かります。i++++i もただ単に i を増加させる役割を果たすだけです。

まとめ

種類 使用例 説明
前置インクリメント ++i 値を1増加させた後に変数を使用
後置インクリメント i++ 変数を使用した後に値を1増加

デクリメント演算子(--ii--)も同じ動作規則に従います。

参考文献

https://zenn.dev/keisuke713/articles/1b331a5ee9e8bb
https://kanda-it-school-kensyu.com/java-super-intro-contents/jsi_ch05/jsi_0502/

Discussion