2

考虑以下代码:

void concatenate(char *s1, char *s2){
    while(*s1 != '\0'){
       s1++;
    }
    for (; *s1 = *s2; s1++, s2++){  
    }   
}

在上述函数中,在 for 循环中,*s1 = *s2 每次都会检查条件。这怎么可能?
它还将指向的值分配给指向s2的值,s1然后检查什么以使循环继续?

4

6 回答 6

5

指令将地址 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) 

这是您将字符串从s2to复制的方式s1,并检查字符串终止符号是否出现\0(=0作为 ASCII 值)。

于 2013-08-01T08:44:31.840 回答
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

于 2013-08-01T08:54:53.750 回答
1

分配的值是检查的值。该值被分配,然后如果该值为零(表示字符串的结尾),则循环退出。

在 C 中,赋值操作也是一个表达式,表达式的值就是被赋值的值。

于 2013-08-01T08:43:48.617 回答
1

s1并且s2都是指针。*s1是指针指向的位置的值。由于您在for循环中移动了两个指针,因此values每次遇到该条件时都会进行不同的比较。

于 2013-08-01T08:44:29.217 回答
1

这是连接两个字符串的程序。第一个 while 循环指针到达字符串 's1' 的末尾。现在在 for 循环中,每个 char froms2都被分配给s1.

于 2013-08-01T08:44:37.357 回答
0

for 循环运行直到它的条件表达式为真(表示不为零)。当到达字符串 s2 的末尾,即 '\0' 与 0(false) 相同时,它被分配给 *s1 并且它为零,所以现在条件表达式为 false,因此退出 for 循环

于 2013-08-01T10:09:34.310 回答