水無月ばけらのえび日記

bakera.jp > 水無月ばけらのえび日記 > PHPでは"0x0A"=="10"がtrue > 「PHPでは"0x0A"=="10"がtrue」へのコメント

「PHPでは"0x0A"=="10"がtrue」へのコメント

[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のマニュアルを参照しているのは、単純にマニュアルを書くのが面倒だっただけかもしれません。

ご参考まで。

新規投稿フォーム

※広告や宣伝の書き込みはご遠慮ください。

:

:

:

最近の日記

関わった本など