Java | インクリメント/デクリメントを条件式に入れたときの落とし穴

Java Java
スポンサーリンク

条件式に入れたときの落とし穴

では「インクリメント/デクリメントを条件式に入れたときの落とし穴」をまとめてみますね👇


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++ で統一)
  • 配列アクセスは「今の要素を使うのか、次の要素を使うのか」を明確に意識する

💡 まとめると:
条件式にインクリメントを入れると「比較に使う値」と「その後の値」がズレるため、思わぬ挙動やバグにつながります。初心者のうちは 条件式に ++/– を入れない と決めておくのが安全です。

タイトルとURLをコピーしました