i++と++i、実行順序で迷う方へ 〜自戒を込めて〜
はじめに
早速ですが、抜き打ちテストです。
Q.次のプログラムの実行結果は?
public class Test {
public static void main(String[] args) {
int i = 0;
System.out.println(i++ + ++i);
}
}
答え
2 (0 + 2 = 2
)
抜き打ちテストはこれで終了です。いかがだったでしょうか?
即答できたあなたへ
おめでとうございます!この記事の内容はすでにマスター済みですね。どうぞそっと記事を閉じていただいて構いません。
即答できなかったあなたへ
仲間です!
あなたは過去の私と同じく、前置・後置インクリメントをわかったつもり状態である可能性大です。本記事を通してしっかり理解し、次のステージへ進みましょう。(勉強との終わりなき闘い・・・)
i++, ++i の挙動について
Javaにおけるインクリメント演算子は、前置インクリメント (++i
) と 後置インクリメント (i++
) の2種類あります。
基本ルール
種類 | 使用例 | 説明 |
---|---|---|
前置インクリメント | ++i |
値を1増加させた後に変数を評価 |
後置インクリメント | i++ |
変数を評価した後で値を1増加 |
デクリメント(--i
やi--
)についても同様の動作をします。
詳細な挙動の例
具体的なプログラム例を用いて、それぞれの動きを確認してみましょう。
例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
は、i
を 1増やしてから その値を返す。 -
i++
は、i
を そのまま返した後で 値を1増やす。
抜き打ちテスト問題の解説
public class Test {
public static void main(String[] args) {
int i = 0;
System.out.println(i++ + ++i);
}
}
-
i++
の部分で、現在のi
の値(0
)が評価されます。この時点で、i
は1増えます。
評価: 0, iの値: 1
- 続いて、
++i
の部分でi
が1増加して2
になり、その値が評価されます。
評価: 2, iの値: 2
- 足し算が行われて
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増加 |
デクリメント演算子(--i
、i--
)も同じ動作規則に従います。
参考文献
Discussion