考虑以下代码:
void concatenate(char *s1, char *s2){
while(*s1 != '\0'){
s1++;
}
for (; *s1 = *s2; s1++, s2++){
}
}
在上述函数中,在 for 循环中,*s1 = *s2
每次都会检查条件。这怎么可能?
它还将指向的值分配给指向s2
的值,s1
然后检查什么以使循环继续?
指令将地址 by 处的值"*s1 = *s2
复制到地址 bys2
处的值,s1
然后该值成为 for 循环中的中断条件,因此循环运行直到\0
找到等于0
。(注意,在 C 中,nul char 的 ASCII 值\0
为零 = false
)。
for (; *s1 = *s2 ; s1++, s2++)
^ ^
| |
assign increments both
*s2 to *s1,
then break condition = *s1 (updated value at *s1 that is \0 at the end)
这是您将字符串从s2
to复制的方式s1
,并检查字符串终止符号是否出现\0
(=0
作为 ASCII 值)。
我重新格式化了代码,使它看起来更好,更容易解释,我以注释的形式添加了解释。
我还按照编译器的建议在分配周围添加了括号(在启用警告的情况下编译时)。
void concatenate(char *s1, char *s2)
{
/* s1 initially points to the first char of the s1 array,
* this increments it until it's reached the end */
while(*s1 != '\0')
s1++;
/* the initialisation part is empty as there's no initial assignment
* the test condition tests if assignment evaluates to positive,
* when null terminator is reached it will evaluate to negative
* which will signal the end of the loop
* the afterthought increments both pointers
* */
for (; (*s1 = *s2) ; s1++, s2++)
;
}
请注意,此函数非常不安全,因为在没有空终止符的情况下,指针可能会递增以指向无效内存。
它也不会检查是否s1
足够大以容纳s2
。
分配的值是检查的值。该值被分配,然后如果该值为零(表示字符串的结尾),则循环退出。
在 C 中,赋值操作也是一个表达式,表达式的值就是被赋值的值。
s1
并且s2
都是指针。*s1
是指针指向的位置的值。由于您在for
循环中移动了两个指针,因此values
每次遇到该条件时都会进行不同的比较。
这是连接两个字符串的程序。第一个 while 循环指针到达字符串 's1' 的末尾。现在在 for 循环中,每个 char froms2
都被分配给s1
.
for 循环运行直到它的条件表达式为真(表示不为零)。当到达字符串 s2 的末尾,即 '\0' 与 0(false) 相同时,它被分配给 *s1 并且它为零,所以现在条件表达式为 false,因此退出 for 循环