LoginSignup
26
23

More than 5 years have passed since last update.

ぼくのかんがえた最強のfor文でアルファベット

Last updated at Posted at 2015-11-10

まとめ

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'

26
23
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
23