for i は駄目要素の塊

説明する前に、まずはコードを見てほしい。

for (i = 0; i > 10; i++) {
    System.out.println(i);
}

一見、普通のループ処理で特に問題が無いように思える。
ところが、このコードは動かない。
比較演算子が逆だからだ。

これはあくまで例だけど、 for iの問題点を表したいい例だと思う。

そもそも for iは 初期化、比較、加算(更新)の3つの要素でループを表現する。
つまり、1つの"ループする処理"に最低でも3つの要素を必要とするということだ。

これはコーディングする上で厄介な存在になる。
例えばループ内でエラーが発生した際に、原因の切り分けが以下のようになる

  • 初期化が間違っている
  • 比較が間違っている
  • 更新が間違っている
  • ループ内が間違っている

確かに上3つ関しては簡単に判断がつくだろう。
けど、そもそも「考えなければいけない」というのが面倒だ。
実装したいのは"ループしたい処理"なのだから"ループの処理"なんて考える必要はない。

自分は仕事柄 Javaをよく触るが for iが原因のバグと何度か対面したことがある。
2重ループでのindexの指定間違い、以下と未満の間違い etc...
おかげで for i w見ると肝心のループ内の処理に集中できない様になってしまった...冗談じゃない。

確かに Javaに関しては for iは仕方がないというのはある。(Java 8が業務で採用されるなんて奇跡に近い話なので...
けど、for i 以外の実装がサポートされている言語であれば、迷わず for i を切り捨てるべきだ。

一応、最後にfor iの唯一のメリット(?)を挙げておくとするのなら、
それは参照順序が保証されるということだけど、そもそも参照順序に依存するような書き方をしてる時点でお察し状態な訳で...
やっぱり for i は間違っている