[英]Default return value in recursion
考虑以下众所周知的代码来查找数字的阶乘。
int fact(int num)
{
if (num != 1)
return num * fact(num - 1);
else
return num;
}
现在考虑相同的另一个变体
int fact(int num)
{
if (num != 1)
return num * fact(num - 1);
}
第一个看起来很干净,如果我们给num作为4,它将是4*3*2*1
。 即使编译器可能发出警告,第二个也可以正常工作。 但是在后一种情况下,如果num
变为1,则没有return语句。那么计算如何进行? 该代码仅在num
为1时返回1时才有效。有人可以解释一下4*3*2*x
发生了什么。 x如何返回为1。谢谢。
编辑:我正在使用gcc 4.8.2
第二种错误是不正确的,没有“默认返回值”之类的东西,这种行为是完全不确定的!
考虑一下,编译器将如何知道fact(1) == 1
?
如果让我猜测,我会说您想避免使用else
东西,在这种情况下,默认的返回值应该是最后一句话。
int fact(int num)
{ // pre: num > 0
if (num != 1)
return num * fact(num - 1);
return num;
}
第二段代码不正确,您认为不重要的警告可能类似于:
警告:控制到达非无效功能的结尾
您必须在所有路径中提供返回值,否则(当num
为1
)是未定义的行为,没有默认的返回值 ( main
除外)。
这是未定义的行为,这意味着结果完全取决于特定的编译器。 因此,我认为您应该避免这种情况。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.