尝试了解strtok的此实现中的代码

山姆·哈马米

我是一个很有ç新手,我按照从斯坦福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是局部静态,因此一旦找到令牌便会保留,并在找不到更多令牌时将其重置为NULL

2)后续的strtoken传递sNULL

因此,如果将第一笔支票写为:

if (s == NULL && p == NULL)

还是有这样的原因写?

最后:return p = NULL; 这只是以下内容的简写:

p = NULL;
return p;

CS107冬季18截屏视频

2011年令人惊叹的CS107讲座

基于Rpi的CS107e

巴勃罗
if (s == NULL && ((s = p) == NULL))

确实不一样

if (s == NULL && p == NULL)

尽管它们具有相同的结果,当spNULL

您已经正确确定了的后续调用strtok必须与一起传递NULL,但是,如果仍然要返回令牌,p则不会对其进行测试NULL

因此((s = p) == NULL),分配一个聪明的技巧是s指向可能在其中找到更多令牌的字符串的其余部分。

在C中,当您评估类似的表达式时A && BA将被评估,并且B仅当且仅当A被评估为true时才被评估,其原因是后续点

如果s不是NULL,则((s = p) == NULL)从不评估,s = p从不分配。

如果sNULL,则((s = p) == NULL)进行评估。首先s = p进行评估,这是一项任务。如果p不是NULL,则s指向p所指向的位置(源的其余部分),当与进行比较时NULL,它的计算结果为false,因此return NULL不会执行,函数将继续查找标记。

但是如果p也为NULLs则将其设置为指向NULL,当NULL与之比较时,结果为true,则整个结果if为true并return NULL执行。s最初为isNULLpis时NULL,则意味着已找到所有令牌并返回,因此函数应返回NULL可以将其重写为:

if(s == NULL)
{
    if(p == NULL)
        return NULL;

    s = p;
}
...

请注意,分配的值就是分配本身的值。

return a = b;

和做的一样

a = b;
return b;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章