gpt4 book ai didi

无法理解 strcmp 函数的一小部分

转载 作者:行者123 更新时间:2023-12-02 08:14:02 26 4
gpt4 key购买 nike

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

我已经了解了 for 循环的使用原理。

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

  1. for (i = 0; s[i] == t[i]; i++)它没有长度,取而代之的是 s[i] == t[i]

  2. 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 ( <em>expr1<sub>opt</sub></em> ; <em>expr2<sub>opt</sub></em> ; <em>expr3<sub>opt</sub></em> ) <em>statement</em>

expr1expr2expr3 是可选的。声明

for ( ; ; ) { // do something }

将“永远”循环,除非在循环主体的某处有 breakreturn 语句。

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

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

expr3(如果存在)在循环体的每次迭代后计算。它通常会更新 expr2 中正在测试的内容。

for (i = 0; s[i] == t[i]; i++) It have no length instead have this s[i] == t[i]

只要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

for ( ; *s == *t; s++, t++)

与第一个循环做完全相同的事情,但不是使用 [] 运算符索引到 st,它只是使用指针。因为没有什么要初始化的,所以第一个表达式只是空的。

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com