条件是什么:'* s1 = * s2'到底是做什么的?

时间:2013-08-01 08:41:29

标签: c pointers for-loop

请考虑以下代码:

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

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

6 个答案:

答案 0 :(得分:5)

指令"*s1 = *s2s2处的地址值复制到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)

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

答案 4 :(得分:1)

这是连接两个字符串的程序。第一个while循环指针重复到字符串's1'的结尾。现在,在for循环中,s2中的每个字符都被分配到s1

答案 5 :(得分:0)

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