关于TCPL中的strcpy()函数

3
我正在阅读《C程序设计语言》这本书,当它涉及到“字符指针和函数(5.5)”时,我遇到了一个问题。
在第5.5节中,作者展示了四个版本的strcpy()函数。我的问题出现在第三个版本中:
/*strcpy: copy t to s; pointer version 3*/
void strcpy(char *s, char *t)
{
    while (*s++ = *t++)
        ;
}

没有任何字符可以和'\0'进行比较。在这种情况下,循环如何终止?

2
C语言的设计基本上就是为了编写这种类型的代码。 - Zan Lynx
3个回答

4
*s++ = *t++

等同于

(*s++ = *t++) != 0

这相当于

(*s++ = *t++) != '\0'

1
那么这只是一个“习语”,就像作者所说的那样? - 1MinLeft
@1MinLeft 是的 [15个字符] - lost_in_the_source

3

有一件事情需要注意。赋值语句的值是被赋的那个值。因此,它将检查所分配的值是否为 0 ('\0'),这正是这里所期望的。

同样,这段代码可以简化为以下内容(这是它的工作方式)。可以这样想——至少会进行一次复制。因此,它向我们展示了它将是一个do-while循环。

char somechar;
do {
   somechar = *t;
   *s = somechar ;
   s++;
   t++;
} while( somechar );

1
在C语言中,if (var = expression)表示1) 将expression赋值给var,然后2) 检查var是否评估为TRUEwhile (var = expression)也是如此。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接