条件式に入れたときの落とし穴
では「インクリメント/デクリメントを条件式に入れたときの落とし穴」をまとめてみますね👇
1. while文での違い
int i = 0;
while (i++ < 5) {
System.out.println(i);
}
Java- 1回目:
i++→ 比較に使うのは 0、その後 i=1 - 出力: 1, 2, 3, 4, 5
int i = 0;
while (++i < 5) {
System.out.println(i);
}
Java- 1回目:
++i→ 先に i=1、その値で比較 - 出力: 1, 2, 3, 4
👉 違い:
i++は「5まで出力」++iは「4まで出力」
2. if文での混乱
int x = 0;
if (x++ == 0) {
System.out.println("条件成立");
}
System.out.println("x = " + x);
Java- 判定に使うのは 0(成立)、その後 x=1
- 出力:
条件成立
x = 1
int x = 0;
if (++x == 0) {
System.out.println("条件成立");
}
System.out.println("x = " + x);
Java- 先に x=1、その値で比較(0ではないので不成立)
- 出力:
x = 1
👉 バグ例:
「x++ == 0 で条件を満たすと思ったら、実際は ++ の位置で結果が変わる」。
3. for文の条件に入れる
for (int i = 0; i++ < 3;) {
System.out.println(i);
}
Java- 1回目: i=0 → 比較に0を使う → 0<3 成立、その後 i=1
- 出力: 1, 2, 3
for (int i = 0; ++i < 3;) {
System.out.println(i);
}
Java- 1回目: ++i → i=1、その値で比較 → 1<3 成立
- 出力: 1, 2
👉 違い:
i++→ 3まで出力++i→ 2まで出力
4. 配列アクセスでの落とし穴
int[] arr = {10, 20, 30};
int i = 0;
while (i++ < arr.length) {
System.out.println(arr[i]); // ❌ ArrayIndexOutOfBoundsException
}
Java- ループの最後で i が配列の範囲を超えてしまう。
👉 対策:
- 配列アクセスは
arr[i++]のように「使ってから増やす」か、 ++iを使うなら初期値を -1 にする。
バグを避けるコツ
- 条件式に ++/– を直接書かない(読みづらく、バグの温床)
- ループのカウンタは for文の「増加部分」に書く(
i++で統一) - 配列アクセスは「今の要素を使うのか、次の要素を使うのか」を明確に意識する
💡 まとめると:
条件式にインクリメントを入れると「比較に使う値」と「その後の値」がズレるため、思わぬ挙動やバグにつながります。初心者のうちは 条件式に ++/– を入れない と決めておくのが安全です。
