考虑一个可能永远不会退出的函数foo()
:
int foo(int n) {
if(n != 0) return n;
else for(;;); /* intentional infinite loop */
return 0; /* (*) */
}
有效的C是否省略了最终的return语句?如果我遗漏最后的陈述,它会引起不确定的行为吗?
答案 0 :(得分:3)
您可以省略无限循环之后的最后return
个参数。但是你可能会得到编译警告,就像并非所有路径都返回。在函数中使用无限循环并不好。保持一个条件来打破循环。
如果在那种情况下确实需要无限循环,那么return
语句之后就是死代码。删除它不会是不确定的行为。
答案 1 :(得分:3)
即使它没有返回语句也会返回,除非你使用返回值,否则没有UB。
答案 2 :(得分:1)
对于非void
函数,根本没有return
语句或者并非所有路径都有return
语句是有效的。
例如:
// This is a valid function definition.
int foo(void)
{
}
或
// This is a valid function definition.
int bar(void)
{
if (printf(""))
{
exit(1);
}
return 0;
}
但是读取foo
的返回值是未定义的行为。
foo(); // OK
int a = foo(); // Undefined behavior
int b = bar(); // OK