出于教育目的(是 42 是),我正在重写 strncmp,一位同学刚刚来问我为什么要以这种方式转换我的返回值。我的建议是先进行类型转换,然后再取消引用。我的逻辑是我想将 char 字符串视为 unsigned char 字符串并取消引用它。
int strncmp(const char *s1, const char *s2, size_t n)
{
if (n == 0)
return (0);
while (*s1 == *s2 && *s1 && n > 1)
{
n--;
s1++;
s2++;
}
return (*(unsigned char *)s1 - *(unsigned char *)s2);
}
他的目的是先取消引用,然后再进行类型转换,以确保它返回两个无符号字符之间的差异。像这样:
return ((unsigned char)*s1 - (unsigned char)*s2);
在讨论之后(我同意他的看法,我的演员阵容很奇怪),我们查找了一些生产就绪实现的源代码,令我们惊讶的是,Apple 似乎以与我相同的顺序进行转换/取消引用:
https://opensource.apple.com/source/Libc/Libc-167/gen.subproj/i386.subproj/strncmp.c.auto.html
因此问题是:在这种情况下有什么区别?为什么选择一个而不是另一个?
(我已经找到了以下内容;但它指定了不同大小的数据类型的强制转换/取消引用,而在字符/无符号字符的情况下,它应该没关系吧?