考虑以下众所周知的代码来查找数字的阶乘。
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则没有返回语句。那么计算如何发生?如果num
为1,则代码仅在返回1时才有效。任何人都可以解释这里发生的事情4*3*2*x
。如何将x返回为1.谢谢。
编辑:我正在使用gcc 4.8.2
答案 0 :(得分:3)
第二种变体是不正确的,没有"默认返回值"这种行为完全未定义!
考虑一下,编译器将如何知道fact(1) == 1
??
如果你让我猜,我会说你想避免使用else
的东西,在这种情况下,默认的返回值应该是最后一句。
int fact(int num)
{ // pre: num > 0
if (num != 1)
return num * fact(num - 1);
return num;
}
答案 1 :(得分:2)
第二段代码不正确,您认为不重要的警告可能是:
警告:控制到达非空函数的结尾
您必须在所有路径中提供返回值,否则(当num
为1
时)它的未定义行为,没有默认返回值(main
除外)。
答案 2 :(得分:0)
这是一种未定义的行为,这意味着结果完全取决于特定的编译器。因此,我认为你应该尽量避免它。