我正在用C读一本书,并且看过这两个strcmp算法。

我已经学会了自我,usel for loop如何工作。

但是这两个for循环对我来说是新的。我不明白这些部分

  • for (i = 0; s[i] == t[i]; i++)它没有长度,而是具有s[i] == t[i]
  • for ( ; *s == *t; s++, t++)什么意思这个家伙;

  • 我了解其他部分,我也知道这些函数返回的内容。
       /* strcmp: return <0 if s<t, 0 if s==t, >0 if s>t */
    int strcmp(char *s, char *t)
    {
       int i;
       for (i = 0; s[i] == t[i]; i++)
           if (s[i] == '\0')
         return 0;
       return s[i] - t[i];
    }
    
    int strcmp(char *s, char *t)
    {
     for ( ; *s == *t; s++, t++)
      if (*s == '\0')
      return 0;
     return *s - *t;
    }
    

    最佳答案

    首先,一些基本知识。
    for循环的语法是

    for ( expr1 ; expr2 ; expr3 ) statement
    
    expr1expr2expr3都是可选的。该声明
    for ( ; ; ) { // do something }
    

    会“永远”循环,除非循环主体中某处有breakreturn语句。
    expr1(如果存在)在循环执行之前被精确评估一次-它用于建立一些初始状态(例如将索引设置为0或分配指针值等)。
    expr2(如果存在)在循环主体的每次迭代之前进行评估。这是继续执行循环的测试条件。如果表达式的计算结果为非零值,则执行循环体;否则,执行循环体。否则,循环退出。如果缺少expr2,则假定其值为1(true)。
    expr3(如果存在)在循环体的每次迭代之后进行评估。它通常会更新expr2中正在测试的内容。



    只要s[i] == t[i]就会执行此循环;一旦t[i]不等于s[i],循环将退出。就其本身而言,这意味着如果您具有相同的字符串,则循环将在字符串末尾运行-如果st都包含"foo",则循环将以
    s[0] == t[0] == 'f'
    s[1] == t[1] == 'o'
    s[2] == t[2] == 'o'
    s[3] == t[3] == 0
    s[4] == t[4] // danger, past the end of the string
    

    因此,在循环体内,代码还将检查a[i]是否为0-如果是,则意味着我们已经将所有匹配到0终止符的字符串都匹配了。

    所以基本上
    s[0] == t[0] == 'f', s[0] != 0, keep going
    s[1] == t[1] == 'o', s[1] != 0, keep going
    s[2] == t[2] == 'o', s[2] != 0, keep going
    s[3] == t[3] == 0, s[3] == 0, at end of s, strings match
    



    的功能与第一个循环完全相同,但是它没有使用[]运算符来索引st,而是使用了指针。由于无需初始化,因此第一个表达式为空。

    关于c - 无法理解strcmp函数的一小部分,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43617113/

    10-11 22:09
    查看更多