我是一个很有ç新手,我按照从斯坦福CS107视频学习(我不是一个学生那里)。
如果有人感兴趣,请点击下面的链接
看下面的实现strtok
,我不确定为什么第一个if语句是这样写的:if (s == NULL && ((s = p) == NULL))
char *strtok(char *s, const char *sep)
{
static char *p = NULL;
if (s == NULL && ((s = p) == NULL))
return NULL;
s += strspn(s, sep);
if (!*s)
return p = NULL;
p = s + strcspn(s, sep);
if (*p)
*p++ = '\0';
else
p = NULL;
return s;
}
到目前为止,我已经确定了以下内容:
1)静态
p
是局部静态,因此一旦找到令牌便会保留,并在找不到更多令牌时将其重置为NULL2)后续的
strtoken
传递s
为NULL
因此,如果将第一笔支票写为:
if (s == NULL && p == NULL)
还是有这样的原因写?
最后:return p = NULL
; 这只是以下内容的简写:
p = NULL;
return p;
if (s == NULL && ((s = p) == NULL))
确实不一样
if (s == NULL && p == NULL)
尽管它们具有相同的结果,当s
和p
时NULL
。
您已经正确确定了的后续调用strtok
必须与一起传递NULL
,但是,如果仍然要返回令牌,p
则不会对其进行测试NULL
。
因此((s = p) == NULL)
,分配一个聪明的技巧是s
指向可能在其中找到更多令牌的字符串的其余部分。
在C中,当您评估类似的表达式时A && B
,A
将被评估,并且B
仅当且仅当A
被评估为true时才被评估,其原因是后续点。
如果s
不是NULL
,则((s = p) == NULL)
从不评估,s = p
从不分配。
如果s
为NULL
,则((s = p) == NULL)
进行评估。首先s = p
进行评估,这是一项任务。如果p
不是NULL
,则s
指向p
所指向的位置(源的其余部分),当与进行比较时NULL
,它的计算结果为false,因此return NULL
不会执行,函数将继续查找标记。
但是,如果p
也为NULL
,s
则将其设置为指向NULL
,当NULL
与之比较时,结果为true,则整个结果if
为true并return NULL
执行。当s
最初为isNULL
和p
is时NULL
,则意味着已找到所有令牌并返回,因此函数应返回NULL
。可以将其重写为:
if(s == NULL)
{
if(p == NULL)
return NULL;
s = p;
}
...
请注意,分配的值就是分配本身的值。
return a = b;
和做的一样
a = b;
return b;
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句