如果递归函数在单独的句子中没有return语句,则返回什么。
#include <stdio.h>
int rec(int i)
{
if (i != 3)
return rec(++i);
}
int main()
{
rec(5);
return 0;
}
答案 0 :(得分:6)
到达任何其他值返回函数的末尾是未定义的行为,但前提是在表达式中使用了函数的结果。
因此,如果任何应该返回值但不返回值的函数以及当我们尝试使用返回的值时,行为是未定义的。在大多数实现中,它返回垃圾。
对于您的情况,您没有使用返回值,因此它在此处无效。此外,您将获得无限递归,因为第一次调用具有5并且在以后的调用中会递增。
答案 1 :(得分:2)
请参阅C11 standard,§6.9.1Function definitions :
12如果到达了终止函数的
}
,并且调用者使用了函数调用的值,则行为未定义。
因此,如果你有一个应该返回一个值的函数,它可能不会返回一个值。但是,如果函数没有返回值,但调用代码之后尝试使用函数的返回值,则行为未定义。 这个函数是否以递归方式使用是无关紧要的。
答案 2 :(得分:1)
如果非空函数没有评估return语句,那么行为是undefined。
根据Cppreference:
到达main之外的函数的末尾相当于 返回;。对于main,请参阅main函数。 到达任何其他人的结尾 值返回函数是未定义的行为,但仅限于结果 该函数用于表达式。
C标准,5.1.2.2.3,第1段[ISO / IEC 9899:2011]:
“到达},终止main函数返回值 “因此,允许控制在不执行return语句的情况下到达main()函数的末尾。
答案 3 :(得分:0)
当其他人指出时,它是未定义的行为。对于整数溢出,双重如此。这是gcc在x86_64上的功能(当你忽略警告时):
0000000000000000 <rec>:
0: f3 c3 repz retq
它只返回返回寄存器中的任何值。
其他完全有效的结果将是形成你的硬盘或将你的灵魂卖给魔鬼。我希望clang能用#ub2操作码转换它,但不能测试这个atm。