2

用 C 编写的字符串复制函数有两个版本。我的问题是为什么 version1 需要 "!= '\0'" 而 version2 不需要。如果我有一个字符 0 要使用 version2 复制,'0' 会终止应对过程吗?

void version1(char to[], char from[])
{
    int i;

    i = 0;
    while ((to[i] = from[i]) != '\0')
        ++i;
}

char *version2(char *dest, const char *src)
{
    char *addr = dest;
    while (*dest++ = *src++);
    return addr;
}

另外,为什么像“1230456”这样的输入不会终止处理,因为字符串中间出现了“0”?

4

5 回答 5

6

这是因为在 C 中与零比较是可选的。当您在需要逻辑表达式的上下文中使用表达式时,C 会为您插入一个与零的隐式比较。

您可以如下重写第一个函数而不更改语义:

while ((to[i] = from[i]))
    ++i;

此外,您可以将第二个函数重写如下:

while ((*dest++ = *src++) != '\0');
于 2013-11-12T18:42:49.033 回答
0

在第二个版本中也有完全相同的!= 0测试,但它是隐含的:表达式的结果*dest++ = *src++变成了由 检查的值while,并且在 C 中,所有测试归结为与零的比较。

出于同样的原因,在第一个示例中,while可以重写该行:

while (to[i] = from[i])

而不是改变意思。

于 2013-11-12T18:43:24.097 回答
0

两个版本都进行相同的检查,在第二个版本中您只是看不到它。您可以尝试!= '\0'从第一个版本中删除,它应该仍然可以工作。

于 2013-11-12T18:44:19.213 回答
0

version1 不需要,!= '\0'但包含它是更好的编程实践。'\0' 恰好等于 0,因此 version2 可以工作,但是,如果你碰巧遇到 '\0' 不为零的系统,则 version2 将无法工作。

于 2013-11-12T18:47:01.390 回答
0

可能尚未提及的一件事是,在第二个示例中复制零终止的原因是因为后增量确保在检查零值之前复制该值,从而终止循环。

于 2013-11-12T19:29:05.167 回答