考虑一个foo()
可能永远不会退出的函数:
int foo(int n) {
if(n != 0) return n;
else for(;;); /* intentional infinite loop */
return 0; /* (*) */
}
省略最终的返回语句是否有效?如果我省略最后的陈述,它会引起未定义的行为吗?
考虑一个foo()
可能永远不会退出的函数:
int foo(int n) {
if(n != 0) return n;
else for(;;); /* intentional infinite loop */
return 0; /* (*) */
}
省略最终的返回语句是否有效?如果我省略最后的陈述,它会引起未定义的行为吗?
您可以省略return
无限循环之后的最后一条语句。但是您可能会收到编译警告,例如并非所有路径都返回。在函数中有无限循环是不好的。保持一个条件来打破循环。
如果在这种情况下确实需要无限循环,那么return
之后的语句就是死代码。删除它不会是不确定的行为。
即使它在没有返回语句的情况下返回,也没有 UB,除非您使用返回值。
对于非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