'\ 0'相关问题

时间:2008-10-29 14:54:18

标签: c++ string

查看将一个c-string复制到另一个c-string的循环:

void strcpyr(char *s, char *t)
{
    while(*s++=*t++)// Why does this work?
        ;
}

为什么我们不在while循环中检查'\ 0'字符,像这样?

while((*s++=*r++)!='\0')..

第一个循环是如何终止的?

7 个答案:

答案 0 :(得分:12)

语句* s ++ = * t ++不仅将下一个字符从t分配给s,还返回当前值* t作为表达式的结果。 while循环终止于任何false值,包括'\ 0'。

这样想。如果你这样做了:

char c = *s++ = *t++;

除了将char从* t复制到* s并递增两者之外,还会将c设置为* t的当前值。

答案 1 :(得分:4)

当我们点击'\0'最初指向的字符串中的t时,执行赋值的*s++=*t++也会返回分配给s指向的位置的值。 {1}}或'\0',评估为false并终止循环。

在第二个示例中,您明确依赖于赋值返回指定字符的事实,而第一个示例隐式使用此事实(以及0字符(也写为'\0'的事实)被认为是假的,而所有其他字符评估为真,因此表达式c != '\0'将产生与c相同的结果。

答案 2 :(得分:2)

循环将终止,因为'\ 0'实际上是0,而“while”正在评估的不是等于测试(==)的结果,而是赋值表达式的右值

答案 3 :(得分:1)

我们没有明确检查零的原因是在C 0中是假的。

因此循环

while(*s++=*t++)
;
当t指向的字符为0时,

将终止。

- 亚当

答案 4 :(得分:0)

我认为你的意思是写这个:

void strcpyr(char *s, char *t) {
  while (*s++ = *t++);
}

当“t”指向的值为零时,循环终止。对于C(和C ++)循环和条件,任何非零的整数都为真。

答案 5 :(得分:0)

while循环正在测试赋值的结果。 赋值的结果是分配到语句左侧的值。在最后一次迭代中,当* t =='\ 0'时,'\ 0'被赋值为s,这将成为while循环在决定退出时所考虑的值。

答案 6 :(得分:0)

在C中,a = b实际上是一个被评估为'b'的表达式。写起来更容易:


if(a=b) {
 //some block
}

然后:


a=b;
if(a!=0) {
 //some block
}

在if语句中的if语句中,对于语句,所做的检查是:表达式不是零吗?