【发布时间】:2014-02-16 03:43:26
【问题描述】:
我正在构建一个基本的 shell,并试图了解一个基本的 for 循环。我很困惑,因为我习惯于当条件为假时 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) {
...
}
}
直觉告诉我,一旦达到某个进度数字,for 循环就会停止,但我对这个逻辑的表达很感兴趣——它是如何工作的?我不是在每次循环迭代后都重置 p 吗?为什么不写成 p = some number?
【问题讨论】:
-
“直觉告诉我”——作为一个显然非常缺乏经验的 C 程序员,你不应该指望你的直觉——这个是非常错误的。任何非零都是真的,所以当
p为NULL 时它会停止。这种遍历链表的循环在 C 语言中很常见。p = some number——这将是一个严重的错误;希望您的编译器会警告您有关 if 条件中的赋值。 -
@JimBalter 哦,我真傻...谢谢!
-
其他人已经告诉你发生了什么。我只想补充一点,如果我正在审查这个代码,我会发现它的风格很糟糕——添加一个 explicit != NULL 可以增加清晰度而没有负面影响。事实上,IMO 这应该是一个 while 循环,而不是一个 for 循环——使用 for 这种循环是非常不寻常的。
-
“在这种循环中使用 for 是非常不寻常的”——呃,不。我亲自写了数百甚至数千篇。我从来没有把这种东西写成while循环,我认为这样做很愚蠢(如果循环包含
continue,这也是危险的)。!= NULL有助于提高可读性,但我通常会省略它。