2009-10-22 70 views

回答

5
*s1 = *s2 

是一个表达式。 C/C++中的表达式计算为值,在这种情况下,它返回分配给*s1的值。当'\0'被指定为*s1时,表达式评估为0,其清楚地为false

+0

+1击败了我。 – Tom 2009-10-22 18:08:04

+0

难道它不取决于运营商的返回类型=? (是的,在这里我们正在处理内置函数,但是有一个自定义类...) – 2009-10-22 19:13:53

+0

@Matthieu M. C/C++中的表达式总是评估一些东西。这适用于用户定义类型或内置类型的值:struct myclass {}; int main(){myclass(); }'。我对第一句话中的“总是”并不是100%确定的,但是我对C/C++语句的理解。 – AraK 2009-10-22 19:19:00

2

是的。它必须是一个布尔表达式,可以是任何内部的表达式。

其工作原理如下:

void mystery1(char *s1, const char *s2) 
{ 
    while (*s1 != '\0') // NEW: Stop when encountering zero character, aka string end. 
     s1++; 

    // NEW: Now, s1 points to where first string ends 

    for (; *s1 = *s2; s1++, s2++) 
     // Assign currently pointed to character from s2 into s1, 
     // then move both pointers by 1 
     // Stop when the value of the expression *s1=*s2 is false. 
     // The value of an assignment operator is the value that was assigned, 
     // so it will be the value of the character that was assigned (copied from s2 to s1). 
     // Since it will become false when assigned is false, aka zero, aka end of string, 
     // this means the loop will exit after copying end of string character from s2 to s1, ending the appended string 

     ; // empty statement 
    } 
} 

这样做是从S2的所有字符复制到S1末端,基本上追加S2到S1。

要明确,\n与此代码无关。

+0

零不被称为行尾。它是字符串的结尾。 – 2009-10-22 18:12:28

+0

错字,修正。 Thx – DVK 2009-10-22 18:12:51

+0

它不代表0个字符表示空终止符。 – JonH 2009-10-22 18:13:10

0

该代码与'\ n'无关。赋值表达式的结果是赋值变量的新值,所以当您将'\ 0'赋值给*s1时,该表达式的结果为'\ 0',将其视为false。循环遍历整个字符串被复制的点。

0

是这样的代码,检查额外的括号我说...:

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

    for (; *s1 = *s2; s1++, s2++) 
    { 
    ; // empty statement 
    } 
} 

所以,也先检查字符串S1末端;和s1结尾的副本s2。

+0

当作用域只包含一个表达式时,不需要作用域操作符。 – Marcin 2009-10-22 18:40:09