FC2ブログ
2009
06.19

やっぱりPHPの==比較が理解できない

理解できません・・・

var_dump("10" == "0x0a");
bool(true)

var_dump(10 == "0x0a");
bool(true)

var_dump("10" == 0x0a);
bool(true)

var_dump(10 == 0x0a);
bool(true)

var_dump("0" == "0x");
bool(false)

var_dump(0 == "0x");
bool(true)



var_dump("0" == "0x"); は false なのに

var_dump(0 == "0x"); が true になるのが理解できません。
→これは、

文字列の最初の部分により値が決まります。文字列が、 有効な数値データから始まる場合、この値が使用されます。その他の場合、 値は 0 (ゼロ) となります。


ということのようです。(文字列の数値への変換より)
ということで、納得しました。

じゃぁなんで、
var_dump("0" == "0x"); は false なのに、
var_dump("10" == "0x0a"); は true なのか?

整数値を文字列と比較する際、文字列が 数値に変換されます。 数値形式の文字列を比較する場合、それは整数として比較されます。



両方文字列だと、数値への変換は行われない?
ということだと、var_dump("10" == "0x0a"); は true の説明がつきません。

もちろん、
var_dump(0 == "0") は true です。
0 = "0" = "0x" が成り立ちません。

再度実験。

var_dump("" == 0);
bool(true)

var_dump("0" == 0);
bool(true)

var_dump("" == "0");
bool(false)



うーん、これを見てる限り、"0" の場合は、数値化を行ってないのかも??

だけど、
var_dump("0" == "00000");
bool(true)
なので、してないわけないですね。

var_dump("" == NULL);
bool(true)

var_dump(0 == NULL);
bool(true)

var_dump("0" == NULL);
bool(false)




うーん、やっぱよくわからない。

phpのソース読むしかないのかな?
まぁ読もうとしてどこだかわからなくて挫折したわけだg

Devel::Peek みたいなのないかな。


てか、ぺちぱーの人は、だったら === 使えとか言い出すんだと思うけど、
だったら == いらないじゃんと言いたい。



ちなみに、strtod の検証コード(はじめてのC!!!!)

#include <stdio.h>
#include <stdlib.h>

#define N 256

int main(void) {
double a;
char str[N] = {'\0'}, *p;

fgets(str, N, stdin);

a = strtod(str,&p);
printf("Number = %f\n",a);
printf("Error = %s\n",p);
}


で、コンパイルして

$ echo 0x | ./main.out
Number = 0.000000
Error = x



0x だけだとエラーです。

strtod の説明にもあるように

16 進数は、"0x" または "0X" とその後に続く 1 文字以上の 16 進の数字の列からなり



なので、0x の次に、数値あるいは、abcdefABCDEF が続いていなければ、16進数とはみなしません。
スポンサーサイト



トラックバックURL
http://noriko3.blog42.fc2.com/tb.php/220-be371af0
トラックバック
コメント
管理者にだけ表示を許可する
 
back-to-top