まとめ
for文はintに対してのみ使おう。
経緯
for文でアルファベット http://qiita.com/ao_love/items/b08286c9344ab8fd33f0
を読んで、キモいPHPerである私は「PHPなら文字列直接インクリメントできるよ」と思って書いてみたのだが、思わぬ落とし穴にハマった。
前提
for($i='a';$i<'z';$i++) echo $i;
は
abcdefghijklmnopqrstuvwxy
となる。"a"
の次は"b"
であり、実に 直感的な 挙動である。
本題
for($i='a';$i<='z';$i++) echo $i;
は
abcdefghijklmnopqrstuvwxyz
とはならない。
ネタバレ
abcdefghijklmnopqrstuvwxyzaaabacad(中略)aybycydyeyfygyhyiyjykylymynyoypyqyrysytyuyvywyxyyyz
どうしてこうなった
'z'
をインクリメントすると'aa'
になる。
'z' <= 'z'
は当然trueだが、その次も 'aa' <= 'z'
となり、結果はtrueとなりループが'z'
で止まらない。
26進数を進めていって、yz
の次、za
に到達したところでようやく 'za' <= 'z'
という比較になり、結果がfalseとなってループが停止する。
社内の反応
弊社内では大好評でした。以下のような反応を頂いております。
"なんで文字列をインクリメントするんですか……"
"これもう(プログラミング言語なのか)わかんねぇな"
"こんな謎挙動を誘発するコードを書くほうが悪い"
"くるっとる"
別にPHP固有じゃないよね...
ruby -e 'i="a"; while i <= "z" do; puts i; i.succ!; end'