【问题标题】:C: For loop variable as it's own stopping condition?C: For 循环变量作为它自己的停止条件?
【发布时间】: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 有助于提高可读性,但我通常会省略它。

标签: c shell loops for-loop


【解决方案1】:

这是遍历linked list 的标准方式。当 p 计算结果为假时,循环终止。在 C 中,任何不为 0 的东西都会计算为真。 P 是指向链表节点的指针,当它为 NULL 时会变为 false。您可以像这样以更清晰的方式重新编写它:

process_t *p;

for(p = j->first_process; p != NULL; p = p->next) {
     ...
}

【讨论】:

    【解决方案2】:
    for(p = j->first_process; p; p = p->next) {
         ...
    }
    

    等价于

    p = j->first_process
    while(p) {
         ...
         p = p->next;
    }
    

    【讨论】:

      【解决方案3】:

      在 C 语言中,如果您将一个指针传递给一个条件(在 if、for 或 while 循环中),它将测试该指针是否为 NULL。

      所以这些:

      proccess_t *p;
      
      if(p){ ... }
      for(p = ...; p; ...){ ... };
      

      等价于这些

      if(p != NULL){ ... }
      for(p = ...; p != NULL; ...){ ... };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-16
        • 2021-02-16
        • 2015-12-08
        • 1970-01-01
        相关资源
        最近更新 更多