无限循环后是否需要return语句?

时间:2019-10-23 09:51:50

标签: c

这是好代码吗(可读性强,编译器会编译它):

int is_thing_five() {
  while (1) {
    if (thing_is_ready) {
      return thing == 5;
    }

    update_thing();
  }
}

还是在无限循环之后必须有一个return语句

int is_thing_five() {
  while (1) {
    if (thing_is_ready) {
      return thing == 5;
    }

    update_thing();
  }
  return 0;
}

2 个答案:

答案 0 :(得分:3)

在C语言中,使用从没有显式返回值的非空函数返回值的行为是 undefined

因此,不,您不需要return语句,即使该函数的末尾是可到达的,您也不需要它,只要该函数的调用者不使用return即可。值。

int main是此规则的例外:您可以从自身(间接或其他方式)调用main,并且可以在任何分支上假设隐式return 0;没有明确的返回值。


有趣的是,在C11之前,具有“什么都不做”的无限循环的函数的行为是未定义。但是C11通过标准中的脚注定义了行为:

C11,6.8.5广告6:

  

其控制表达式不是常量表达式的迭代语句, 156)不执行输入/输出操作,不访问易失性对象,并且在其主体中不执行同步或原子操作表达式,或者(在for语句的情况下)其表达式3,可以由实现假定为终止。 157)

     
     

157) 这旨在允许编译器转换,例如即使无法证明终止也可以删除空循环。

答案 1 :(得分:0)

嗯,您不需要它。但是,某些编译器会向您发出警告,您可以通过编译来取消警告,也可以通过获得额外的收益来取消警告。然后,这也可能使您对其他编译器发出警告,因为该语句不可访问。

对于那段代码,我会尝试将if测试移到while中,所以你有

int is_thing_five() 
{
    while (not thing_is_ready)
    {
         update_thing();
    }
    return thing == 5;
}

这更清晰一些,因为它没有无限循环,并且在中间没有测试可以打破它。