「PHPでは"0x0A"=="10"がtrue」へのコメント
「水無月ばけらのえび日記 : PHPでは"0x0A"=="10"がtrue」について、4件のコメントが書かれています。
[5471] Re:「PHPでは"0x0A"=="10"がtrue」
のぐー (2009年6月19日 9時46分)
strtod()が16進数を受け付けるようになったのはC99からなんですが、GCCを除く世の中の大半のCコンパイラはいまだにC90です。
PHPをそれらで再コンパイルすると挙動が変わると思われますが……。
[5473] Re:「PHPでは"0x0A"=="10"がtrue」
りゅう (2009年6月20日 6時37分)
>strtod()が16進数を受け付けるようになったのはC99からなんですが、GCCを除く世の中の大半のCコンパイラはいまだにC90です。
>PHPをそれらで再コンパイルすると挙動が変わると思われますが……。
PHPのマニュアルには16進表記のことは書いていないので、C99のstrtod()の挙動は考慮外なのだと思います。
でもなんでC99でわざわざ16進表記に対応するなんて変なことをしたんですかね。
素直に別関数にすればよかったのに。
[5474] Re:「PHPでは"0x0A"=="10"がtrue」
のぐー (2009年6月20日 11時5分)
>でもなんでC99でわざわざ16進表記に対応するなんて変なことをしたんですかね。
>素直に別関数にすればよかったのに。
実はstrtod()関数の仕様は(文章としては)変わっていません。
「浮動小数点定数と同様の形式の変換対象列」と書いてるだけです。
つまり、C99で「浮動小数点定数」に16進表記が加わったので、strtod()関数もそれに引きずられて変わったということです。
(ソース上で定数を書くとき、10進だとどうしても誤差がでるため、この改良自体は納得いくものです。)
なのでC99でstrtod()の仕様を変更しないためには文章のほうを
「10進浮動小数点定数と同様の形式」と変更しなければならなかったのですが、それを忘れたのでしょうか?
[5502] Re:「PHPでは"0x0A"=="10"がtrue」
hnw (2009年7月8日 21時49分)
はじめまして。本件ですが、PHPは随分前からstrtodを自前で持っています。Zend/zend_strtod.cというのがそれです。strtodのマニュアルを参照しているのは、単純にマニュアルを書くのが面倒だっただけかもしれません。
ご参考まで。
「水無月ばけらのえび日記 : PHPでは"0x0A"=="10"がtrue」についてコメントを書く場合は、以下のフォームに記入してください。