【发布时间】:2021-01-08 07:37:03
【问题描述】:
int foo(int i)
{
if(i != 0)
foo(i - 1);
else
return i;
}
GCC 警告control reaches end of non-void function [-Wreturn-type]。
自从上一个将eax 设置为0 的return 语句以来,从任何其他路径返回时,它都会返回0。此外,无论我编写return foo(i - 1),编译器资源管理器都会生成完全相同的代码。可以将其视为有保证的行为吗?
【问题讨论】:
-
你的递归构造必须有一个
base case!这将有编译器正在寻找的“回退”返回语句(由于前瞻性是有限的,编译器无法确定控制何时到达代码的返回语句)。 -
如果有多个返回路径并且其中一个返回修改了 eax,这可能不成立,这就是我的想法。在这种情况下,是的,你是对的。
-
不,您不能将其视为有保证的行为,原因很简单,C++ 标准说它是未定义的行为。您正在查看编译器的行为,而不是 C++ 标准。
-
查看我提出的副本的第二个最受好评的答案。
-
请同时阅读这个链接的问题。