ちょいと故がありまして、PHPのstrcmpの実装を調べていたのですが…思ったよりも、僅かに、不思議な実装をしておりました。
ZEND_API int zend_binary_strcmp(const char *s1, uint len1, const char *s2, uint len2) /* {{{ */ { int retval; if (s1 == s2) { return 0; } retval = memcmp(s1, s2, MIN(len1, len2)); if (!retval) { return (len1 - len2); } else { return retval; } } /* }}} */
5.3系以下だと、どうも
if (s1 == s2) { return 0; }
が無いっぽいのですが、ンなものはフレーバー。
ポイントは、ここ。
retval = memcmp(s1, s2, MIN(len1, len2)); if (!retval) { return (len1 - len2); } else {
………うを? 減算? memcmpで「短い方に長さを合わせてる」? なんだこりゃ?
実験その1。
echo strcmp('a', 'b') , "\n";
戻り値-1。うん。
実験その2
echo strcmp('a', 'bcdefgh') , "\n";
戻り値-1。うん。
実験その3
echo strcmp('a', 'abcdefghijkl') , "\n";
戻り値-11。………ををう!
うんまぁマニュアルにちゃんと書いてあるのですが。
str1 が str2 よりも小さければ < 0 を、str1が str2よりも大きければ > 0 を、 等しければ 0 を返します。
興味深い実装だなぁ、とか思ったので、おもむろに、memo。