インクリメント(++)やデクリメント(--)は便利ですが、初心者がつまずきやすい「バグの温床」でもあります。代表的なパターンを整理しました。
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;」を手で追ってみると、かなり頭の体操になります。
