ちょいと故がありまして、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。