Windowsのxamppでは正常な結果が得られました。
質問の内容が分散していました。
ここでききたかったことは、"PHP最高"と5を比較して、どうして1を返すかということでした。その辺りについて解説をなかなか見つけることができないのでここで質問させていただきました。
あらためてよろしくお願い致します。
▽1
●
soqans ●100ポイント ベストアンサー |
戻り値が異なる理由は突き詰めると「PHPを実行するプログラムを作り出したプログラム」に依存する、というものです。
説明をしますと、PHPのstrcmp関数は内部的に
・比較対象の値を強制的に文字列に変換する(型キャストにより文字列型に変換したときと同じ動作)
・文字列化したそれぞれの値をC言語のmemcmp関数で比較(短い方の長さまで)
・異なる場合はmemcmp関数の結果、同じ場合は長さの差を返す
という動作をおこなっているようです。ところが、このmemcmp関数は「比較対象の文字列が前にあるときは負の値、等しいときは0、後ろにあるときは正の値を返す、という仕様を満たす動作を行う」としか決められていません。そのため、仕様が満たされていれば返す値は何でも良い、ということになっています。
このmemcmp関数ですが、いくつかのコンパイラで動作を見てみると、
・VisualStudio系(Windows):-1or0or1の3値のみ返す
・Xcode系(Mac):バイナリの差分値を返す
・GCC系(主にLinux):-1or0or1の3値のみ返す
という結果となりました。
おそらくこれが書籍とMacの環境で結果が異なる理由だと思います。
初めの質問文ですが5を文字列に変換して文字コード(UTF-8)を取ると
"P":0x50
"p":0x70
"5":0x35
ですので、"php最高"と5をstrcmpで比較すると"p"-"5"=59となって、正の数なので1が返される、という処理と考えられます。
(小文字でも大文字でも正の数ですのでWinもしくはLinuxでは1ですが、Mac環境では小文字では59、大文字では27になると思います)
もう一つの質問にある-1および1を返す例ですが、UTF-8を使用している場合(0xというのは16進数表記を表しますが)
"入":0xE5 0x85 0xA5
"タ":0xE3 0x82 0xBF
となるので、(初めに異なっている位置だけ見ると)"P"-"p"=-32、"入"-"タ"=2となり、Macの結果は記述の通りとなり、値を-1?1へ変換するものでは-1と1を返す、という動作だと思われます。