がるの健忘録

エンジニアでゲーマーで講師で占い師なおいちゃんのブログです。

strcmpの興味深い実装

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