试图理解这个 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;
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)
虽然结果一样,但是当s
和p
是NULL
时
您已正确识别必须传递 strtok
的后续调用
使用 NULL
,但是如果仍然要 returned 标记,则 p
不会
测试 NULL
.
所以 ((s = p) == NULL)
是一个巧妙的技巧,可以将 s
分配给指向
可能会找到更多标记的字符串的其余部分。
在 C 中,当您对 A && B
等表达式求值时,A
会被求值,而 B
仅当且仅当 A
被评估为真时才会评估,原因
这是 sequent points.
如果 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
它的计算结果为真,整个 if
的计算结果为真并执行 return NULL
。当 s
最初是 NULL
并且 p
是 NULL
,那么
表示已找到所有令牌并且return,因此函数应该return
NULL
。可以改写为:
if(s == NULL)
{
if(p == NULL)
return NULL;
s = p;
}
...
请注意,赋值的值是赋值本身的值。
return a = b;
等同于做
a = b;
return b;
我是一个 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 found2) subsequent calls of
strtoken
pass ins
asNULL
因此,如果将第一个检查写成:
,那么第一次检查会不会相同if (s == NULL && p == NULL)
或者有这样写的原因吗?
最后:return p = NULL
;这只是一个 shorthand for:
p = NULL;
return p;
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)
虽然结果一样,但是当s
和p
是NULL
时
您已正确识别必须传递 strtok
的后续调用
使用 NULL
,但是如果仍然要 returned 标记,则 p
不会
测试 NULL
.
所以 ((s = p) == NULL)
是一个巧妙的技巧,可以将 s
分配给指向
可能会找到更多标记的字符串的其余部分。
在 C 中,当您对 A && B
等表达式求值时,A
会被求值,而 B
仅当且仅当 A
被评估为真时才会评估,原因
这是 sequent points.
如果 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
它的计算结果为真,整个 if
的计算结果为真并执行 return NULL
。当 s
最初是 NULL
并且 p
是 NULL
,那么
表示已找到所有令牌并且return,因此函数应该return
NULL
。可以改写为:
if(s == NULL)
{
if(p == NULL)
return NULL;
s = p;
}
...
请注意,赋值的值是赋值本身的值。
return a = b;
等同于做
a = b;
return b;