i++ と ++i の違い
評価される値のタイミングが違います。i = i++ が何も変えない理由も解説します。
なぜエラーが出ないのか
出力: 0
(エラーなし)- javacは何も報告しません。文法として正しいためです
出力: 0- 実際の挙動 — 期待した結果と食い違っている箇所
見つけ方- エラーが出ないので、出力を目で確かめるしかありません。この種の誤りが最も発見が遅れます
このエラーが出る典型パターン
パターン1
1 public class Main { 2 public static void main(String[] args) { 3 int i = 0; 4 System.out.println(i++ ); ^ 5 } 6 }
出力: 0期待: 1 (コンパイルは通っています)
i++ は インクリメント前の値を返します。先に増やしてから使うなら ++i です。
直し方: i++ を ++i にします。
広告
広告スロット(未設定)
パターン2
1 public class Main { 2 public static void main(String[] args) { 3 int i = 5; 4 i = i++ ; ^ 5 System.out.println(i); 6 } 7 }
出力: 5期待: 6 (コンパイルは通っています)
i = i++ は元の値を代入し直すため何も変わりません。自己代入とインクリメントを混ぜないのが安全です。
直し方: i++ を i + 1 にします。
よくある誤解
ループの i++ と ++i は結果が同じです。違いが出るのは、その値を使うときだけです。
まとめ
i++ と ++i の違いは中級でつまずきやすい項目です。上の2パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。