查看将一个c-string复制到另一个c-string的循环:
void strcpyr(char *s, char *t)
{
while(*s++=*t++)// Why does this work?
;
}
为什么我们不在while循环中检查'\ 0'字符,像这样?
while((*s++=*r++)!='\0')..
第一个循环是如何终止的?
答案 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语句中,对于语句,所做的检查是:表达式不是零吗?