请考虑以下代码:
void concatenate(char *s1, char *s2){
while(*s1 != '\0'){
s1++;
}
for (; *s1 = *s2; s1++, s2++){
}
}
在上面的函数中,在for循环中,每次都检查条件*s1 = *s2
。怎么可能呢?
它还将s2
指向的值分配给s1
指向的值,然后检查什么以使循环继续?
答案 0 :(得分:5)
指令"*s1 = *s2
将s2
处的地址值复制到s1
处的地址值,然后该值成为for循环中的中断条件,因此循环运行直至找到\0
等于0
。 (注意,\0
nul char的ASCII值在C中为零= 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
复制到s1
的方法,并检查字符串终止符号是否为\0
(= 0
为ASCII值)。
答案 1 :(得分:2)
我已经重新格式化了代码,使其看起来更好,并且更容易解释,我已经以评论的形式添加了解释。
我还根据编译器的建议添加了赋值周围的括号(在启用警告时进行编译)。
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
。
答案 2 :(得分:1)
分配的值是检查的值。分配该值,然后如果该值为零(表示字符串的结尾),则循环退出。
在C中,赋值操作也是一个表达式,表达式的值是要赋值的值。
答案 3 :(得分:1)
s1
和s2
都是指针。 *s1
是指针指向的位置的值。由于您在for
循环中移动了两个指针,因此每次达到该条件时都会比较不同的values
。
答案 4 :(得分:1)
这是连接两个字符串的程序。第一个while循环指针重复到字符串's1'的结尾。现在,在for循环中,s2
中的每个字符都被分配到s1
。
答案 5 :(得分:0)
for循环运行,直到它的条件表达式为真(表示不为零)。当到达字符串s2的末尾,即'\ 0'与0(假)相同时,它被分配给* s1并且它为零,所以现在条件表达式为假,因此退出for循环