Java | インクリメント/デクリメントのよくあるバグパターンループとインクリメントの関係

Java Java
スポンサーリンク

では「ループの中でのインクリメント(i++ / ++i)」について整理してみましょう。

1. for文での使い方

for (int i = 0; i < 5; i++) {
    System.out.println(i);
}
Java
  • ここでの i++ は「ループの最後に 1 増える」役割。
  • 実行結果は 0, 1, 2, 3, 4

👉 ポイント: i++ でも ++i でも結果は同じ。
なぜなら「ループの最後に評価される」から、前置/後置の違いが影響しない。


2. while文での使い方

int i = 0;
while (i < 5) {
    System.out.println(i);
    i++;
}
Java
  • i++ を忘れると無限ループになる。
  • ++i にしても動作は同じ。

3. do-while文での使い方

int i = 0;
do {
    System.out.println(i);
    ++i;
} while (i < 5);
Java
  • ++i でも i++ でも結果は同じ。
  • ループの「最後で増える」ことが大事。

4. 前置と後置の違いが出るケース

ループの条件や代入に直接使うと違いが出る。

例1: while文の条件に入れる

int i = 0;
while (i++ < 5) {
    System.out.println(i);
}
Java
  • 1回目: i++ → 0 を比較(条件は true)、その後 i=1
  • 出力: 1, 2, 3, 4, 5

int i = 0;
while (++i < 5) {
    System.out.println(i);
}
Java
  • 1回目: ++i → 1 にしてから比較(条件は true)
  • 出力: 1, 2, 3, 4

👉 違い:

  • i++ → 5 まで出力
  • ++i → 4 まで出力

例2: 配列アクセス

int[] arr = {10, 20, 30, 40};
int i = 0;

while (i < arr.length) {
    System.out.println(arr[i++]); // 今の要素を使ってから i を増やす
}
Java
  • 出力: 10, 20, 30, 40
int[] arr = {10, 20, 30, 40};
int i = -1;

while (++i < arr.length) {
    System.out.println(arr[i]); // 先に増やしてから使う
}
Java
  • 出力: 10, 20, 30, 40

👉 どちらも結果は同じになるが、初期値の設定が違う


バグを避けるコツ

  • for文のカウンタは i++ で統一(読みやすさ重視)
  • 条件式に ++/– を埋め込まない(混乱のもと)
  • 配列アクセスは i++ を使うと自然(「今の要素を使ってから次へ」)

💡 まとめると:

  • ループの「増加部分」では i++++i の違いはほぼない。
  • ただし「条件式」や「配列アクセス」に入れると挙動が変わる。
  • 初心者は「ループの最後に i++」と覚えておけば安全。

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