在K& R书中,下面给出了复制字符串的初始(和正确)函数
void strcpy (char *s, char *t)
{
while ( (*s++ = *t++) != '\0')
;
}
然后据说等效函数是
void strcpy (char *s, char *t)
{
while (*s++ = *t++)
;
}
我不明白while循环如何在第二种情况下停止。
由于
答案 0 :(得分:4)
简单赋值表达式有两个效果:
1)将值存储到左侧的左值(这被称为'副作用')
2)表达式本身的计算结果为一个值 - 分配给该左值的值
while
循环将重复,直到其条件计算为0.因此第二个示例中的循环将一直运行,直到将值0分配给目标字符串。
答案 1 :(得分:2)
这是因为对于表达式,返回表达式的结果。
if( (a = 4) == 4)
此if
语句将评估为True
。
所以,在你的情况下
while (*s++ = *t++)
当它到达NUL
字符\0
时,它将评估为False
,循环将退出。
答案 2 :(得分:2)
表达式*s++ = *t++
在评估后也有一个值。如果它评估为非零值,则条件为true
,否则为false
。
while (*s++ = *t++)
相当于while ((*s++ = *t++) != 0)
。