这是好代码吗(可读性强,编译器会编译它):
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;
}
答案 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;
}
这更清晰一些,因为它没有无限循环,并且在中间没有测试可以打破它。