小编wan*_*ata的帖子

返回char字符串的指针之间的差时,强制转换和取消引用的顺序有多重要?

出于教育目的(是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来说,应该没关系吗?

在C语言中,如果我强制转换并取消引用一个指针,那么我首先执行哪个操作是否重要?

c casting dereference strncmp

6
推荐指数
1
解决办法
60
查看次数

标签 统计

c ×1

casting ×1

dereference ×1

strncmp ×1