我正在用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
expr1
,expr2
和expr3
都是可选的。该声明for ( ; ; ) { // do something }
会“永远”循环,除非循环主体中某处有
break
或return
语句。expr1
(如果存在)在循环执行之前被精确评估一次-它用于建立一些初始状态(例如将索引设置为0或分配指针值等)。expr2
(如果存在)在循环主体的每次迭代之前进行评估。这是继续执行循环的测试条件。如果表达式的计算结果为非零值,则执行循环体;否则,执行循环体。否则,循环退出。如果缺少expr2
,则假定其值为1(true
)。expr3
(如果存在)在循环体的每次迭代之后进行评估。它通常会更新expr2
中正在测试的内容。只要
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
,而是使用了指针。由于无需初始化,因此第一个表达式为空。关于c - 无法理解strcmp函数的一小部分,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43617113/