优化的strcmp实现

Cod*_*ith 11 c string-comparison strcmp

这个功能在这里找到.这是一个实现strcmp:

int strcmp(const char* s1, const char* s2)
{
    while (*s1 && (*s1 == *s2))
        s1++, s2++;
    return *(const unsigned char*)s1 - *(const unsigned char*)s2;
}
Run Code Online (Sandbox Code Playgroud)

我理解除了最后一行之外的所有内容,简言之,最后一行是怎么回事?

chu*_*ica 5

return *(const unsigned char*)s1-*(const unsigned char*)s2;
Run Code Online (Sandbox Code Playgroud)

OP:简言之,最后一行是怎么回事?

答:比较第一个潜在的字符串差异.两者均按规范要求chars引用unsigned char.2被提升为,int并返回差异.


笔记:

1返回值的符号(<0,0,> 0)是最有意义的部分.它是C规范中唯一指定的部分.

2在某些系统charsigned(更常见).在其他人,charunsigned.定义最后一次比较的"符号"可以提高可移植性.请注意,fgetc()获取字符为unsigned char.

除了字符串以a结尾之外,所使用\0的字符编码(如ASCII - 最常见)在二进制级别上没有区别.如果char2个字符串中的第一个s具有值65和97,则第一个字符串将小于第二个字符串,即使字符编码是非ASCII.strcmp("A", "a")当字符编码为ASCII时,OTOH 将返回负数,但可能会在不同的字符编码中为其基础值返回正数,并且顺序不由C定义.