2009-06-17

PHPの比較の素晴らしさ加減は正常


if ("0x0A" == "10") {
    print '(´ε` )チュッ';
}

チュッ。されちゃいます。

文字列であっても整数解釈できる文字列の場合は勝手に型変換しやがる今世紀最大の愚行を犯してしまうってのは有名な話だよね。

文字列であっても整数解釈できる文字列の場合は自動的に整数に型変換してくれる超便利機能があるってのは有名な話だよね。

だけどなんでコレが一致するかわけがわからんかった。

0x0Aは10進数で10になるので一致する。と、言いたいところなんですがそう単純な話じゃないんだ。

以下の例を目ん玉見開いて見て欲しい。


var_dump(0x0A);
var_dump("0x0A");
var_dump((int)"0x0A");
var_dump((float)"0x0A");
var_dump(intval("0x0A"));

実行結果
int(10)
string(4) "0x0A"
int(0)
float(0)
int(0)

つまり文字列の"0x0A"ってやつはどう考えても0と解釈されるはずなんだ。だから上記if文が本来一致するはずがいない。

でも実際は何故か10と解釈されて一致してしまう。

そう、つまり演算子で比較した場合、やらんでもいいのにわざわざ16進表記かどうかまでチェックして余計なお世話的うんこ変換しやがるということになる。

そう、つまり演算子で比較した場合は、16進表記かどうかまでチェックして10進数に変換してくれているということになる。

明示的に書くならこんな感じだ。


if (intval("0x0A",16) == "10") {
    print '(´ε` )チュッ';
}

クソが。

なるほどねー。

ただでさえ文字列同士の比較なのにintに変換されるだけでもミソ糞うぜぇのに、わざわざ16進数の場合は10進数に変換してくれる超糞尿仕様

文字列同士の比較であってもintに自動変換してくれるだけでも素晴らしいのに、それに加えて16進数の場合は10進数に変換してくれる超便利仕様

ってこたぁ、8進数表記の場合も糞糞マジ死ぬほど余計なお世話するんだろうなぁと思ってしぶしぶ試してみた。

ということは8進数表記の場合もこの素晴らしい自動変換しれくるのかなと思って試してみた。


if ("0x0A" == "012") {
    print '(´ε` )チュッ';
}
else {
    print '\(^o^)/';
}

実行結果
\(^o^)/

おー、さすがPHP!、やっぱ8進数の場合は10進数と似てるから8進数と見なすよりも10進数と見なしたほうが効率いいですもんね。いやーわかってるなー。ますますPHPが好きになりました。I Love PHP. We Love P☆H☆P!

はは、はははっ、ははははっ。やるならやる!やらないならやらない!どっちかに統一せーやこのプリンシパル校長ヘッドハンティンピープルぺーぺーぽりんき味噌マッチョ変態改造エアガン陵辱-2くらいのスカンク殺ろうがぁああああああ★ああああああああああああああああああああああああああああああああああああああfじょ★えいjfsきじぇいつつしまじいのそるいつのだ★ひろけがきちもするけけけそあいんぼろうれあああぁあああああaaaaaa

トラックバック - http://anond.hatelabo.jp/20090617130518
  • http://anond.hatelabo.jp/20090617130518

    興味深い。できたらblogでやってほしいところ。 増田だと流れちまうからなあ。

  • http://anond.hatelabo.jp/20090617130518

    プログラミングのこういう細かいところが死ぬほど嫌い。発狂するほど嫌い。 文字コードとかマジクソが死ねよって感じ。 こういうののせいでいつまでたってもプログラミングが好きに...

    • http://anond.hatelabo.jp/20090617132348

      PHPみたいな糞とまともなプログラミング言語を一緒にするなよw 文字コードについては言語レベルではどうにもならんことはあるが、他の言語での扱いは少なくともPHPよりは楽。 バッド...

      • http://anond.hatelabo.jp/20090617140839

        PHPに限らず、CとかC++もめんどくせーこと多くて嫌いなんだよ…。 あ、C/C++もまともな言語じゃないっすか。そうっすか…。

  • http://anond.hatelabo.jp/20090617130518

    PHPで一番困るのは、この手の変換が直感的でも統一的でもなことだな。 「自分が何をしようとしているのか」が素直に書けないんだよね。 言語として元になっているPerlにも文字と数値...

  • http://anond.hatelabo.jp/20090617130518

    PHPの「==」は「数値として比較する」ためのものであって、そもそも文字列として比較するときに使うためのものではないという説。 文字列比較を意図するのであれば、 if (strcmp("0x0A...