出于教育目的(是42是),我正在重写strncmp,一个同学走近我,问我为什么要以这种方式转换返回值。我的建议是先打字,然后再取消引用。我的逻辑是我想将char字符串视为未签名的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);
}
Run Code Online (Sandbox Code Playgroud)
他首先要取消引用,然后再进行类型转换,以确保绝对返回两个未签名字符之间的差异。像这样:
return ((unsigned char)*s1 - (unsigned char)*s2);
Run Code Online (Sandbox Code Playgroud)
讨论之后(我同意他的说法,我很奇怪),我们查找了一些可用于生产的实现的源代码,令我们惊讶的是,Apple似乎按照与我相同的顺序进行了铸造/取消引用:
https://opensource.apple.com/source/Libc/Libc-167/gen.subproj/i386.subproj/strncmp.c.auto.html
因此,问题是:在这种情况下有什么区别?为什么选择一个呢?
(我已经找到了以下内容;但是它指定了不同大小的数据类型的强制转换/取消引用,但是对于chars / unsigned chars来说,应该没关系吗?