试图理解这个 strtok 实现中的代码

Trying to understand the code in this implementation of strtok

我是一个 c 新手,我正在学习斯坦福的 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++ = '[=10=]';
    else 
        p = NULL;
    return s;
}

这是我目前确定的内容:

1) the static p is a local static so that it persists once a token is found, and reset to NULL when no more are found

2) subsequent calls of strtoken pass in s as NULL

因此,如果将第一个检查写成:

,那么第一次检查会不会相同
if (s == NULL && p == NULL)

或者有这样写的原因吗?

最后:return p = NULL;这只是一个 shorthand for:

p = NULL;
return p;

CS107 Winter 18 Screencasts

Amazing CS107 Lectures from 2011

An Rpi based CS107e

Therefore wouldn't the first check be the same if it were written as:

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

p为NULL时,是的。当 p 不为 NULL 时,没有。因为这样 s=p 的副作用就不会发生。而这个值s在后面if语句为false时使用。

Finally: return p = NULL; is this just a shorthand for:

p = NULL;
return p;

是的。

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

其实和

不一样
if (s == NULL && p == NULL)

虽然结果一样,但是当spNULL

您已正确识别必须传递 strtok 的后续调用 使用 NULL,但是如果仍然要 returned 标记,则 p 不会 测试 NULL.

所以 ((s = p) == NULL) 是一个巧妙的技巧,可以将 s 分配给指向 可能会找到更多标记的字符串的其余部分。

在 C 中,当您对 A && B 等表达式求值时,A 会被求值,而 B 仅当且仅当 A 被评估为真时才会评估,原因 这是 sequent points.

如果 s 不是 NULL,则永远不会计算 ((s = p) == NULL)s = p 是 从未分配。

如果 sNULL,则计算 ((s = p) == NULL)。首先 s = p 是 评估,这是一项任务。如果 p 不是 NULL,则 s 指向 其中 p 指向(源的其余部分)并且与 NULL 相比,它 被计算为 false,因此 return NULL 不被执行并且函数 继续寻找代币。

但是,如果 p 也是 NULL,则 s 被设置为指向 NULL 并且当进行比较时 到 NULL 它的计算结果为真,整个 if 的计算结果为真并执行 return NULL。当 s 最初是 NULL 并且 pNULL,那么 表示已找到所有令牌并且return,因此函数应该return NULL。可以改写为:

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

    s = p;
}
...

请注意,赋值的值是赋值本身的值。

return a = b;

等同于做

a = b;
return b;