通过K&R我看到了一个函数strcopy的代码片段,它将一个字符数组复制到另一个.
如果t是指向第一个数组的指针,并且s是指向要复制到的数组的指针,则代码为:
void strcopy(char *s, char *t){
while(*s++=*t++)
;
}
Run Code Online (Sandbox Code Playgroud)
我对while循环感到困惑.我强调在条件t内复制到s,但我不明白这里测试的是什么条件.什么时候会*t++
是假(或零)?据推测,当字符串结束时.我们可以通过检查字符是否指向来测试字符串是否已完成'\0'
.K&R说了很多.但是,这本书相当愉快地指出,这个测试是没有必要的.所以我想知道这里测试的是什么?
*s++ = *t++;
Run Code Online (Sandbox Code Playgroud)
是相同的:
*s = *t;
t++;
s++;
Run Code Online (Sandbox Code Playgroud)
条件总是评估左值,所以在这种情况下它就像测试一样
while(*s)
Run Code Online (Sandbox Code Playgroud)
当然,'\0'
评估为假,所以你不需要while(something!='\0')
,因为while(something)
就够了.
*s++ = *t++
将评估分配的值.在字符串的末尾,*t
将是'\0'
,并且在赋值时,表达式将计算为'\0'
(C解释为false
).
我猜K&R说没有必要进行额外的测试,因为一切都是在while
条件下处理的.