Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';我不理解strcmp功能的一小部分_C_Strcmp - Fatal编程技术网

Can';我不理解strcmp功能的一小部分

Can';我不理解strcmp功能的一小部分,c,strcmp,C,Strcmp,我正在读一本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

我正在读一本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;
    }
    
    /*strcmp:return t*/
    int strcmp(字符*s,字符*t)
    {
    int i;
    对于(i=0;s[i]==t[i];i++)
    如果(s[i]='\0')
    返回0;
    返回s[i]-t[i];
    }
    int strcmp(字符*s,字符*t)
    {
    对于(;*s==*t;s++,t++)
    如果(*s=='\0')
    返回0;
    返回*s-*t;
    }
    
    在第一种情况下,for
    语句的
    后面的代码正在检查是否找到了字符串结尾标记,如果找到,函数将返回0

    在第二个
    for
    语句中,没有填写
    for
    语句的初始化部分,因此该语句以
    for(;
    开头。这是完全合法的


    祝你好运。

    For循环有3个部分-初始化、条件和循环表达式。所有这些都是可选的。
    所以这个循环-

    for (i = 0; s[i] == t[i]; i++)
    
    它一直运行到字符
    s[i]
    等于
    t[i]
    。这就是条件。如果为false,则循环中断

    条件不一定总是基于长度

    这个呢-

    for ( ; *s == *t; s++, t++)  
    
    如上所述,初始化是可选的,这里不存在,这很好。此循环中的条件也相同,即循环,直到字符相等

    for(i=0;s[i]==t[i];i++)//它没有长度

    实际上,这段代码有点危险,因为它假设传递的字符串以NULL结尾(但稍后读取)。循环只在字符串的左侧部分相等时继续,因此,在循环中,遇到NULL时,唯一可能返回的结果是0(相等)(for(;;)条件确保两个字符串在同一位置都有NULL)

    关于长度,无论如何,要计算它,你应该扫描整个字符串……并且扫描两次(因为有两个字符串)。这个循环将所有字符串合并在一个中。此外,C中的字符串必须以NULL结尾。当然,没有其他方法可以进行此比较

    对于(;*s==*t;s++,t++)//这是什么意思

    这与前面的步骤大致相同,但不是使用索引取消对s和t的引用(并且不涉及它们),它们被修改为一个接一个地指向字符。我相信这会更快,但取决于编译器。此外,递增s和t会丢失字符串的开头;但在这个函数中这不是问题

    关于(;;)
    语法,一条注释已经解释了为什么它是这样写的。for()的最后一部分,在分号和右括号之间,在每次迭代后都会执行。在这种情况下,我们需要增加两个变量,因此有两个语句用逗号分隔

  • 它不必是长度。
  • 循环一直运行到条件为真,因此在这种情况下,它意味着它将一直运行到
    s[i]
    不等于
    t[i]

  • (;*s==*t;s++,t++)的

  • 这里表示省略了
    for
    循环的
    的第一个子句
    bot
    s
    t
    循环的
    之外定义,无需在此处定义

    这是C标准允许的:

    for(第1条;表达式-2;表达式-3)语句

    (……)

    第1条和表达式-3均可省略。省略的表达式-2为 替换为非零常量

    某些编译器,如
    clang
    在第一个子句中放入已定义的变量时会产生警告。例如,此代码:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void)
    {
      int i = 0;
      for (i; i < 10; i++)
        puts("Hi");
    
      return EXIT_SUCCESS;
    }
    
    首先,一些基础知识

    for
    循环的语法为

    for ( expr1opt ; expr2opt ; expr3opt ) statement
    
    将“永远”循环,除非循环体中某处有
    break
    return
    语句

    expr1
    ,如果存在,则在循环执行之前只计算一次-它用于建立一些初始状态(例如将索引设置为0,或分配指针值,或类似的内容)

    expr2
    (如果存在)将在循环体的每次迭代之前进行求值。这是继续循环执行的测试条件。如果表达式求值为非零值,则执行循环体;否则,将退出循环。如果缺少
    expr2
    ,则假定求值为1(
    true

    expr3
    (如果存在)将在循环体的每次迭代后进行评估。它通常会更新在
    expr2
    中测试的内容

    for(i=0;s[i]==t[i];i++)
    它没有长度,而是有这个
    s[i]==t[i]

    只要
    s[i]==t[i]
    ,这个循环就会执行;只要
    t[i]
    不等于
    s[i]
    ,循环就会退出。这意味着,如果
    s
    t
    都包含
    “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
    
    对于(;*s==*t;s++,t++)

    执行与第一个循环完全相同的操作,但它不使用
    []
    操作符索引到
    s
    t
    ,而是使用指针。
    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
    
    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