我正在构建一个基本shell,并试图理解一个基本的for循环。我很困惑,因为我习惯于在条件为假时停止循环,但似乎以下for循环有p有它自己的停止条件?
void spawn_job(job_t *j, bool fg)
{
pid_t pid;
process_t *p;
for(p = j->first_process; p; p = p->next) {
...
}
}
Intuition告诉我,一旦达到某个进度数,for循环就会停止,但我对这个逻辑的表达感兴趣 - 这是如何工作的?我是不是在循环的每次迭代后重置p?为什么不写成p =某个数字?
答案 0 :(得分:3)
这是遍历linked list的标准方式。当p求值为false时,循环终止。在C中,任何非0的值都为真。 P是指向链表节点的指针,当它为NULL时将变为false。你可以用这样更清晰的方式重写这个:
process_t *p;
for(p = j->first_process; p != NULL; p = p->next) {
...
}
答案 1 :(得分:1)
for(p = j->first_process; p; p = p->next) {
...
}
相当于
p = j->first_process
while(p) {
...
p = p->next;
}
答案 2 :(得分:0)
在C中,如果将指针传递给条件(在if,for或while循环中),它将测试该指针是否为NULL。
所以这些:
proccess_t *p;
if(p){ ... }
for(p = ...; p; ...){ ... };
等同于这些
if(p != NULL){ ... }
for(p = ...; p != NULL; ...){ ... };