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

Java Java
スポンサーリンク

インクリメント(++)やデクリメント(--)は便利ですが、初心者がつまずきやすい「バグの温床」でもあります。代表的なパターンを整理しました。


1. 前置と後置の混同

  • 前置(++a) → 先に増えてから使う
  • 後置(a++) → 使ってから増える
int a = 5;
System.out.println(++a); // 6
System.out.println(a++); // 6(表示後に7になる)
System.out.println(a);   // 7
Java

バグ例:
a++ で増えた値をすぐ使える」と思い込む → 実際は古い値が使われる。


2. 複雑な式の中で使う

インクリメントを式の中に埋め込むと、順序がわかりにくくなる。

int a = 3;
int b = a++ + ++a; 
System.out.println(b); // 3 + 5 = 8
Java

バグ例:
a++ + ++a は 4+4 だろう」と勘違い。
→ 実際は「a++(3を使ってから4に)」「++a(さらに5にして使う)」。

👉 対策: 複雑な式にせず、1行ずつ分けて書く。


3. ループ条件での使い方ミス

for (int i = 0; i < 5; i++); { // ← セミコロンに注意!
    System.out.println("Hello");
}
Java

バグ例:
セミコロンをつけてしまい、ループが空回りする。
→ 実際は「Hello」が1回だけ出力される。


4. 配列アクセスでの後置インクリメント

int[] arr = {10, 20, 30};
int i = 0;
System.out.println(arr[i++]); // 10(iは後で1になる)
System.out.println(arr[i]);   // 20
Java

バグ例:
arr[i++] で次の要素が取れる」と思い込む。
→ 実際は「今の要素を使ってから i が増える」。


5. 無限ループの原因

int i = 0;
while (i < 5) {
    System.out.println(i);
    // i++ を書き忘れると無限ループ!
}
Java

バグ例:
インクリメントを忘れて条件が永遠に真のまま。


6. 型の範囲を超える

byte b = 127;
b++;
System.out.println(b); // -128(オーバーフロー)
Java

バグ例:
「127の次は128」と思ったら、型の範囲を超えてマイナスに戻る。


バグを避けるコツ

  • 複雑な式に ++ / -- を埋め込まない
  • ループ条件の直後にセミコロンを置かない
  • 配列アクセスでは「今の値を使うのか、次の値を使うのか」を意識する
  • 小さい型(byte, short)は避けて、基本は int を使う
  • デバッグ時は「1行ずつ分けて書く」ことで挙動を確認する

👉 初心者のうちは「i++ はループの最後に書く」「式の中には入れない」と決めておくと安全です。


練習として「int a = 2; int b = a++ + a++ + ++a;」を手で追ってみると、かなり頭の体操になります。

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