递归中的默认返回值
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,则没有返回语句。那么计算是如何发生的呢?如果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
除外(。
这是一个未定义的行为,这意味着结果完全取决于特定的编译器。因此,我认为您应该尽量避免它。
相关文章:
- 从python中调用C++函数并获取返回值
- 为什么模板类中的对象不能返回值
- 返回值优化:显式移动还是隐式
- lock_guard是否保护返回值
- 调用CreateProcess()并获取字符串的返回值
- 如何使 windows 命令提示符在C++可执行文件上显示返回值?
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 查找 GCD:并非所有控制路径都返回值
- 在 Arduino 上使用 sscanf 会导致与 const char * 不匹配,并且返回值始终相同,尽管输入值不同
- 对于具有引用返回类型的搜索算法,默认返回值应该是什么?
- 返回类型为 int 的函数中的默认返回值 1?
- 是否有C 函数的默认返回值
- 为什么C++未指定 return 语句时不默认构造返回值?
- 默认情况下是函数返回值常量(右值)
- 模板变量的默认返回值
- 递归中的默认返回值
- c++中布尔类型返回函数的默认返回值
- C'Tor 的 C++ 返回值 + 错误处理的默认返回值
- 使用函数返回值作为默认模板非类型形参
- 带有默认返回值的C++弱函子